web-dev-qa-db-fra.com

Rediriger HTTP vers HTTPS: PORT dans Tomcat

J'ai une application Tomcat en cours d'exécution qui possède déjà la règle de redirection suivante de HTTP à HTTP:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

Est-il possible d’ajouter une exception/règle, qu’une requête HTTP spécifique ( http://www.example.com ), soit redirigée vers une autre adresse spécifique, avec un port spécifié (par exemple, https: // www.example.com:8443/test ), sans changer/retirer le connecteur ci-dessus?

13
ABR

La configuration du connecteur que vous avez indiquée ne redirige pas une URL spécifique de la manière que vous supposez. 

Cette configuration agit si vous avez configuré une garantie de transport CONFIDENTIAL pour une application Web à l'intérieur de ce conteneur de servlet.

Je veux dire, si vous avez déployé une application sur ce connecteur, où son descripteur web.xml a un security-constraint comme suit:

<security-constraint>

    <web-resource-collection>
        <web-resource-name>Secured</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>

    ...

    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>

</security-constraint>

Ensuite, Tomcat redirigera tout url-pattern correspondant vers le port configuré afin d'utiliser HTTPS en tant que garant de la confidentialité dans le transport.

Ainsi, si vous souhaitez rediriger une URL spécifique, vous devez compléter la configuration du connecteur par une configuration d'application spécifique.

Modifier

Comme vous le suggérez dans votre commentaire, cela pourrait être une autre étape pour que cette configuration fonctionne. Une fois que vous avez configuré le connecteur http comme indiqué, puis configuré l'application comme je vous l'ai dit, il vous suffit de vous assurer que votre serveur Tomcat dispose d'un connecteur HTTPS configuré, sinon la redirection ne fonctionnera pas.

Pour configurer ce connecteur HTTPS, vous pouvez utiliser une configuration comme suit:

<Connector connectionTimeout="20000"
    acceptCount="100" scheme="https" secure="true"
    port="443" clientAuth="false" sslProtocol="TLS"  
    keystoreFile="PATH_TO_KEY_STORE"  
    keystorePass="KEY_STORE_PASS"  
    keyAlias="KEY_STORE_ALIAS"/>  

Voici un exemple de configuration où je n’ai pas mis certains attributs qui peuvent être importants pour vous en tant que threads attrs, exécuteurs, etc.

Le plus important est la configuration KeyStore dont vous avez besoin pour desservir les connexions HTTPS. Ici vous avez la documentation officielle pour préparer un KeyStore Java pour Tomcat afin de servir HTTPS.

14
malaguna

J'ai une application Tomcat en cours d'exécution qui possède déjà la règle de redirection suivante de HTTP à HTTP:

Comme malaguna a répondu, cette configuration Connector est pas une règle de redirection. Il s'agit simplement d'un paramètre utilisé lors de l'exécution d'une redirection déclenchée par <transport-guarantee>CONFIDENTIAL</transport-guarantee>.

Il n'y a aucun moyen d'écraser ce paramètre application par application.

Si vous souhaitez mieux contrôler cette redirection, vous devez implémenter votre propre filtre qui implémentera une redirection (if (!request.isSecure()) { response.sendRedirect(...);}) ou configurer un tiers .

// Techniquement, dans le code Tomcat 8 actuel, la redirection déclenchée par transport-guarantee est effectuée par la méthode org.Apache.catalina.realm.RealmBase.hasUserDataPermission(...).

10
Konstantin Kolinko

Vous pouvez le faire pour chaque application déployée sur Tomcat en ajoutant ceci à la fin de Tomcat_dir/conf/web.xml:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Entire Application</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <!-- auth-constraint goes here if you requre authentication -->
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Donc, vous n'avez pas à le changer sur le web.xml de votre webapp.

Cela devrait fonctionner, en supposant que https fonctionne déjà sur un autre port (habituellement 443) . Si vous ne le faites pas, assurez-vous que votre Tomcat_dir/conf/server.xml ressemble à ceci:

<!-- Default Tomcat connector, changed the redirectPortport from 8443 to 443 -->
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

<!-- To make https work on port 443 -->
<Connector port="443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true">
    <UpgradeProtocol className="org.Apache.coyote.http2.Http2Protocol"/>
    <SSLHostConfig>
        <Certificate certificateKeyFile="/your/own/privkey.pem"
            certificateFile="/eyour/own/cert.pem"
            certificateChainFile="/your/own/chain.pem"
            type="RSA" />
    </SSLHostConfig>
</Connector>
7
Mateus Viccari

Si vous utilisez Tomcat avec httpd, vous pouvez utiliser RewriteEngine.

Avec le port spécifié est comme ce qui suit dans le fichier http.conf:

NameVirtualHost *:8443 #your specified port
<VirtualHost *:8443>
   ServerName www.example.com
   Redirect permanent / https://secure.example.com/
</VirtualHost>

Voir: RewriteHTTPToHTTPS et Demande de redirection vers SSL

1
tkhm
        <Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="443"/>

        <Connector port="443" 
               SSLEnabled="true" 
               acceptCount="100" 
               disableUploadTimeout="true" 
               enableLookups="false" 
               maxHttpHeaderSize="8192" 
               maxThreads="550" 
               minSpareThreads="25"  
               scheme="https" 
               secure="true" 
               compression="on"
               protocol="org.Apache.coyote.http11.Http11NioProtocol" 
               sslImplementationName="org.Apache.Tomcat.util.net.openssl.OpenSSLImplementation">
                   <UpgradeProtocol className="org.Apache.coyote.http2.Http2Protocol"/> 
                   <SSLHostConfig protocols="TLSv1.2" 
                                  certificateVerification="none" 
                                  ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA">
                                        <Certificate type="RSA" 
                                                     certificateKeystoreFile="/ssl/self-signed/your-keystore.jks" 
                                                     certificateKeystorePassword="123456" 
                                                     certificateKeyAlias="your-alias" /> 
                    </SSLHostConfig>
        </Connector>
0
Renat Gatin