it-swarm.com.de

Umleiten von HTTP zu HTTPS: PORT in Tomcat

Ich habe eine laufende Tomcat-Anwendung, die bereits die folgende Umleitungsregel von HTTP zu HTTPs hat:

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

Ist es möglich, eine Ausnahme/Regel hinzuzufügen, so dass ein bestimmtes HTTPrequest ( http://www.example.com ) an eine andere spezifische Adresse umgeleitet wird, wobei ein Port angegeben ist (say https: // www.example.com:8443/test ), ohne den obigen Connector zu ändern/entfernen?

13
ABR

Die von Ihnen angezeigte Connector-Konfiguration leitet eine bestimmte URL nicht in der von Ihnen gewünschten Weise um. 

Diese Konfiguration wirkt, wenn Sie eine CONFIDENTIAL-Transportgarantie für eine Webanwendung innerhalb dieses Servlet-Containers konfiguriert haben.

Ich meine, wenn Sie eine Anwendung auf diesem Connector bereitgestellt haben, deren web.xml-Deskriptor wie folgt einen security-constraint hat:

<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>

Anschließend leitet Tomcat den übereinstimmenden url-pattern an den konfigurierten Port um, um HTTPS als Garant für die Vertraulichkeit beim Transport zu verwenden.

Wenn Sie also eine bestimmte URL umleiten möchten, müssen Sie die Konfiguration des Connectors um eine bestimmte Anwendungskonfiguration ergänzen.

Bearbeiten

Wie Sie in Ihrem Kommentar vorschlagen, könnte es ein weiterer Schritt sein, um diese Konfiguration zum Laufen zu bringen. Wenn Sie den HTTP-Connector wie gezeigt konfiguriert haben und dann die App wie beschrieben konfiguriert haben, können Sie nur sicherstellen, dass auf Ihrem Tomcat-Server ein HTTPS-Connector konfiguriert ist.

Um diesen HTTPS-Connector zu konfigurieren, können Sie eine Konfiguration wie folgt verwenden:

<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"/>  

Dies ist eine Beispielkonfiguration, bei der ich keine Attribute eingegeben habe, die für Sie als Threads-Attribute, Executoren usw. wichtig sein könnten.

Das Wichtigste ist die KeyStore-Konfiguration, die Sie für HTTPS-Verbindungen benötigen. Hier Sie haben die offizielle Dokumentation, um einen Java KeyStore für Tomcat für HTTPS vorzubereiten.

14
malaguna

Ich habe eine laufende Tomcat-Anwendung, die bereits die folgende Umleitungsregel von HTTP zu HTTPs hat:

Wie malaguna antwortete, ist diese Connector-Konfiguration nicht eine Umleitungsregel. Es ist nur eine Einstellung, die verwendet wird, wenn die Umleitung durch <transport-guarantee>CONFIDENTIAL</transport-guarantee> ausgelöst wird.

Es gibt keine Möglichkeit, diese Einstellung pro Anwendung zu überschreiben.

Wenn Sie eine solche Umleitung besser steuern möchten, müssen Sie einen eigenen Filter implementieren, der eine Umleitung (if (!request.isSecure()) { response.sendRedirect(...);}) implementiert oder einen Drittanbieter konfiguriert.

// Technisch gesehen wird im aktuellen Tomcat 8-Code die von transport-guarantee ausgelöste Umleitung von der org.Apache.catalina.realm.RealmBase.hasUserDataPermission(...)-Methode ausgeführt.

10

Sie können dies für jede in Tomcat implementierte App tun, indem Sie Folgendes am Ende von Tomcat_dir/conf/web.xml hinzufügen:

<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>

Sie müssen es also nicht in der web.xml Ihrer webapp ändern.

Das sollte funktionieren, vorausgesetzt, Sie haben bereits https in einem anderen Port (normalerweise 443) . Wenn dies nicht der Fall ist, stellen Sie sicher, dass Ihr Tomcat_dir/conf/server.xml so aussieht:

<!-- 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

Wenn Sie Tomcat mit httpd verwenden, können Sie RewriteEngine verwenden.

Mit angegebenem Port verhält sich das Folgende wie in der http.conf:

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

Siehe: RewriteHTTPToHTTPS und Anfrage an SSL umleiten

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

Tomcat 9 server.xml-Datei

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
    scheme="https"
    secure="true"
    redirectPort="8443"/>

<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" 
           SSLEnabled="true"
           scheme="https"
           secure="true"
           >
    <SSLHostConfig sslProtocol="TLS" protocols="all" certificateVerification="false">
        <Certificate certificateKeystoreFile="conf/.keystore"
                     certificateKeystorePassword="123456"
                     certificateKeyPassword="123456"                                                  
                     type="RSA" />
    </SSLHostConfig>
</Connector>
0
Dimrad

Das Einfügen von VERTRAULICH in die Datei conf/web.xml ist gut, deckt jedoch nicht die Manager-App und die Host-Manager-App (Tomcat 8.5.38) ab.

Meine Lösung besteht darin, ein Ventil in conf/context.xml einzufügen, das alle http-Anforderungen an https umleitet.

https://bitbucket.org/bunkenburg/https-Valve/src/master/