2013-11-25 5 views
6

Gemäß diesen beiden Antworten (1) (2) ist es möglich, zwei SSL-Zertifikate zu verwenden, die vom selben Tomcat-Server mit Server Name Indication (SNI) dienen.HowTo Setup Tomcat Serving zwei SSL-Zertifikate mit SNI?

Meine Frage ist dann, wie man das einrichtet? Ich könnte zwei virtuelle Hosts einrichten, aber ich habe immer noch nur einen Connector, der dem Client das angegebene SSL-Zertifikat vorlegt. Im Connector kann der Keystore und Alias ​​angegeben werden, der für das Zertifikat verwendet werden soll, aber es gibt keinen Parameter, der angibt, für welchen virtuellen Host dieser Connector bestimmt ist oder welches Zertifikat er dem Client entsprechend der verwendeten Domain präsentieren soll.

Wie kann ich dem Tomcat mitteilen, welches ssl-Zertifikat (oder genauer welcher Keystore) er während der Verwendung von SNI verwenden muss?

(1) https://stackoverflow.com/a/10173447 (2) https://stackoverflow.com/a/6343059

Antwort

14

Sie müssen die Antworten auf diese Frage noch einmal zu lesen. SNI wird auf der Serverseite erst ab Java 8 unterstützt. Die von Tomcat 8 zu unterstützende Java-Mindestversion ist Java 7, daher gibt es momentan keine SNI-Unterstützung in Tomcat.

Es kann möglich sein, SNI optional zu unterstützen, wenn Tomcat unter Java 8 oder höher läuft, aber Codeänderungen in Tomcat erforderlich sind, für die derzeit keine Pläne existieren.

Aktualisierung per Dezember 2014

Hinzufügen von SNI-Unterstützung ist auf der TODO Liste für Tomcat 9. Das ToDo-Liste ist ziemlich lang und SNI ist nicht an der Spitze der Liste. Wie immer sind Patches willkommen.

Sobald SNI in Tomcat 9 implementiert ist, ist es möglich, dass die SNI-Unterstützung auf Tomcat 7 und Tomcat 8 zurück portiert wird.

Update-Stand Juni 2015:

SNI hat für Tomcat implementiert 9. Es wird von allen drei HTTP-Anschluss-Implementierungen (NIO, NIO2 und April/native) unterstützt wird. Um SNI mit NIO oder NIO2 zu verwenden, müssen Sie Tomcat 9 (a.k.a. trunk) von der Quelle kompilieren. Um SNI mit APR/nativ zu verwenden, müssen Sie auch tc-native Trunk kompilieren (nicht der Zweig von 1.1.x, der derzeit von den Tomcat-Versionen verwendet wird).

Die TLS-Konfiguration wurde erheblich geändert, um SNI zu unterstützen. Details werden in der docs Web-Anwendung sein, wenn Sie Tomcat 9.

-Update ab November 2016 bauen:

SNI Unterstützung in Tomcat 8.5.x. enthalten ist Es ist unwahrscheinlich, dass es weiter zurück portiert wird. Es ist unwahrscheinlich, dass es zu 8.0.x oder 7.0.x kommt.

+0

Hat es Fortschritte gegeben, oder ist Ihre Antwort noch heute so? – stepanian

+0

Antwort aktualisiert. –

+0

Danke für das Update. Wenn Google weiterhin SSL für alles einsetzt, wird dies für diejenigen von uns kritischer, die zu arm sind, um für jede SSL-Site eine neue AWS-Serverinstanz zu erstellen :) – stepanian

1

Sie können Nginx/Haproxy (beide unterstützt SNI) vor dem Tomcat installieren und sie werden als Proxy fungieren.

+0

Es gibt in der Tat eine einigermaßen gute Tutorial dazu tun für Haproxy bei http://arstechnica.com/information-technology/2015/ 05/web-served-how-to-make-your-site-all-https-all-time-for-alle/ – idarwin

3

Sie können Setup mehrere SSL-Zertifikate, die unter Konfiguration mit:

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
       maxThreads="150" SSLEnabled="true" defaultSSLHostConfigName="domain1"> 
     <SSLHostConfig hostName="domain1" > 
      <Certificate certificateKeystoreFile="conf/domain1-keystore.jks" certificateKeystorePassword="dom1keystorepwd" 
         certificateKeyPassword="dom1keypwd" 
         type="RSA" /> 
     </SSLHostConfig> 
     <SSLHostConfig hostName="domain2" > 
      <Certificate certificateKeystoreFile="conf/domain2-keystore.jks" certificateKeystorePassword="dom2keystorepwd" 
         certificateKeyPassword="dom2keypwd" 
         type="RSA" /> 
     </SSLHostConfig> 
    </Connector> 

das Protokoll Tweak entsprechend Ihrer Notwendigkeit. Sie könnten auch konfigurieren mit openssl statt jsse.Bitte beachten Sie https://tomcat.apache.org/tomcat-8.5-doc/config/http.html#SSL_Support_-_SSLHostConfig für weitere Unterstützung

Auch defaultSSLHostConfigName ist sehr wichtig, sonst würde es nicht funktionieren. Wählen Sie eine beliebige Domäne als Standard aus.

+0

danke für den Hinweis. funktioniert nicht ohne defaultSSLHostConfigName – MitchBroadhead