Bereitstellung über HTTPS


Konfigurieren des HTTPS Connectors

Um den Apache Tomcat über HTTPS bereitzustellen, sind Anpassungen an der Datei server.xml des Tomcats notwendig.

  1. Öffnen Sie die Datei server.xml (Pfad = /Pfad/Zum/Tomcat/conf/server.xml) mit einem entsprechenden Texteditor
  2. Navigieren Sie zu der u.g. Zeile bzw. dem gesamten Eintrag/Block

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true">
           <SSLHostConfig>
               <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                            type="RSA" ></Certificate>
           </SSLHostConfig>
    </Connector>

    Sollte der entsprechende Block kommentiert sein, so kommentieren Sie diesen aus!

  3. Passen Sie den Inhalt des einkommentierten Connectors an Ihre Gegebenheiten (Pfade/Zertifikate/Port) an. Dies könnte zum Beispiel so aussehen:

    <Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
              URIEncoding="UTF-8"
              maxHttpHeaderSize="65536"
              maxPostSize="10485760"
              relaxedQueryChars="[ \ ] ^ ` { | }">
       <SSLHostConfig hostName="XX.XXXX.XX">
           <Certificate certificateKeyFile="conf/private.key"
                        certificateFile="conf/zertifikat.crt"
                        certificateChainFile="conf/CHAIN.pem"
                        type="RSA" ></Certificate>
       </SSLHostConfig>
    </Connector>

    Weiterführende Informationen zur Konfiguration von der Eigenschaft SSLHostConfig finden Sie in der Dokumentation des Herstellers: https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_SSLHostConfig

Zusammenfassung der wichtigsten Optionen

In der folgenden Tabelle werden die wichtigsten Optionen des obenstehenden Beispiel-Connectors und Ihre Bedeutung kurz zusammengefasst:

AttributWertBeschreibung
port443 (Standard)Über diesen Port wird die Verbindung aufgebaut.
URIEncodingUTF-8UTF-8 ist wichtig für eine durchgängig sauberes Encoding.
maxHttpHeaderSize65536Dieser Wert sollte nicht verändert werden.
maxPostSize1100715200Maximale Größe der Posts (Formulardaten inkl. Datei-Uploads) in Bytes. Der Wert in dem Beispiel ist 1GB.
hostName*Name oder IP Adresse des Hosts.
certificateKeyFile*.keyDer private Schlüssel des Zertifikats.
certificateFile*.crtDas eigentliche Zertifikat.
certificateChainFile*.*Das übergeordnete Zertifikat (Certificate Authority (CA)), wenn nötig.

Weitere Möglichkeiten ein Zertifikat im Tomcat am Connector zu konfigurieren

Neben dem obenstehenden Beispiel gibt es noch andere Möglichkeiten, das verwendete Zertifikat für einen Connector für verschlüsselte Kommunikation zu konfigurieren. Eine Möglichkeit ist es, das Zertifikat, den Private Key und mögliche Zwischenzertifikate in einem Java-Keystore zu importieren und diesen direkt einzubinden:

<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
          URIEncoding="UTF-8"
          maxHttpHeaderSize="65536"
          maxPostSize="10485760"
          relaxedQueryChars="[ \ ] ^ ` { | }">
   <SSLHostConfig>
       <Certificate certificateKeystoreFile="conf/file.keystore"
                    certificateKeystorePassword="meinPasswort" ></Certificate>
   </SSLHostConfig>
</Connector>

Auch KeyPair-Dateien (*.pfx, *.p12) können direkt eingebunden werden:

<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
          URIEncoding="UTF-8"
          maxHttpHeaderSize="65536"
          maxPostSize="10485760"
          relaxedQueryChars="[ \ ] ^ ` { | }">
   <SSLHostConfig>
       <Certificate certificateKeystoreFile="conf/file.pfx"
                    certificateKeystorePassword="meinPasswort"
                    certificateKeystoreType="PKCS12" ></Certificate>
   </SSLHostConfig>
</Connector>

Weiterführende Informationen zur Konfiguration für die Zertifikate finden Sie in der Dokumentation des Herstellers: https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_Certificate

Einschränken auf bestimmte TLS-Versionen

Wenn für verschlüsselte Verbindungen nur bestimmte Versionen von TLS unterstützt werden sollen, kann dies über die Attribute protocols und sslProtocol in der SSLHostConfig des Connectors konfiguriert werden. Eine beispielhafte Konfiguration, welche nur die TLS-Versionen 1.2 und 1.3 zulässt, könnte wie folgt aussehen:

<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
          URIEncoding="UTF-8"
          maxHttpHeaderSize="65536"
          maxPostSize="10485760"
          relaxedQueryChars="[ \ ] ^ ` { | }">
   <SSLHostConfig protocols="TLSv1.2+TLSv1.3">
       <Certificate certificateKeyFile="conf/private.key"
                    certificateFile="conf/zertifikat.crt"
                    certificateChainFile="conf/CHAIN.pem"
                    type="RSA" ></Certificate>
   </SSLHostConfig>
</Connector>

Einschränken auf bestimmte TLS-Ciphers

Falls zusätzlich eine Einschränkung der möglichen Verschlüsselungsalgorithmen gewünscht wird, kann diese mit dem Attribut ciphers vorgenommen werden.


Das folgende Beispiel ist keine Sicherheitsempfehlung. Es dient lediglich zur Veranschaulichung, wie eine Konfiguration aussehen könnte:

<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
          URIEncoding="UTF-8"
          maxHttpHeaderSize="65536"
          maxPostSize="10485760"
          relaxedQueryChars="[ \ ] ^ ` { | }">
   <SSLHostConfig protocols="TLSv1.2+TLSv1.3" ciphers="TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_CCM,TLS_DHE_RSA_WITH_AES_128_CCM_8,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_CCM,TLS_DHE_RSA_WITH_AES_256_CCM_8,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256">
       <Certificate certificateKeyFile="conf/private.key"
                    certificateFile="conf/zertifikat.crt"
                    certificateChainFile="conf/CHAIN.pem"
                    type="RSA" ></Certificate>
   </SSLHostConfig>
</Connector>

Nähere Informationen zur Konfiguration und den möglichen Optionen der Attribute finden Sie in der Dokumentation des Herstellers: https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_SSLHostConfig

Erzwingen von HTTPS

Sollte der komplette Server ausschließlich über HTTPS betrieben werden empfiehlt es sich den Standard HTTP-Connector zu entfernen bzw. auszukommentieren. Sollte dies keine Option sein gibt es zusätzlich die Möglichkeit sowohl für den ganzen Server, als auch für einzelne Anwendungen eine Kommunikation über HTTPS zu erzwingen. Hierfür kann in die Datei web.xml des Servers (/Pfad/Zum/Tomcat/conf/web.xml) oder der Anwendung (/Pfad/Zum/Tomcat/webapps/formcycle/WEB-INF/web.xml) innerhalb des Knotens web-app folgendes eingefügt werden:

<security-constraint>
   <web-resource-collection>
       <web-resource-name>Entire Application</web-resource-name>
       <url-pattern>/*</url-pattern>
   </web-resource-collection>

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