如何使用SNI设置Tomcat提供两个SSL证书?

时间:2013-11-25 10:59:32

标签: tomcat ssl ssl-certificate sni

根据这两个答案(1)(2),可以使用服务器名称指示(SNI)从同一个tomcatserver提供两个ssl证书。

我的问题是,如何设置? 我可以设置两个虚拟主机,但我仍然只有一个连接器向客户端提供指定的ssl证书。在连接器中,可以指定用于证书的密钥库和别名,但是没有参数说明此连接器用于哪个虚拟主机,或者根据使用的域应该向客户端提供哪个证书。

如何告诉tomcat在使用SNI时他必须使用哪个ssl证书(或更正确的哪个密钥库?)

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

3 个答案:

答案 0 :(得分:14)

您需要重新阅读这些问题的答案。在Java 8之前,服务器端不支持SNI.Tomcat 8必须支持的最低Java版本是Java 7,所以目前在Tomcat中没有SNI支持。

如果Tomcat在Java 8或更高版本上运行,则可以选择性地支持SNI,但是在Tomcat中需要对目前没有计划的代码进行更改。

截至2014年12月更新:

添加SNI支持位于Tomcat 9的TODO列表中.TODO列表很长,SNI目前不在列表的顶部。一如既往地欢迎补丁。

一旦在Tomcat 9中实现SNI,SNI支持可能会被反向移植到Tomcat 7和Tomcat 8.再次,修补欢迎。

截至2015年6月更新:

已经为Tomcat 9实现了SNI。所有三个HTTP连接器实现(NIO,NIO2和APR / native)都支持它。要将SNI与NIO或NIO2一起使用,您需要从源代码编译Tomcat 9(a.k.a. trunk)。要将SNI与APR / native一起使用,您还需要编译tc-native trunk(不是Tomcat版本当前使用的1.1.x分支)。

TLS配置已发生重大变化以支持SNI。一旦构建了Tomcat 9,详细信息将在docs Web应用程序中。

自2016年11月起更新:

Tomcat 8.5.x中包含SNI支持。它不太可能进一步向后移植。即它不太可能达到8.0.x或7.0.x。

答案 1 :(得分:4)

您可以使用以下配置设置多个ssl证书:

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

根据您的需要调整协议。 您也可以使用openssl而不是jsse进行配置。请参考 https://tomcat.apache.org/tomcat-8.5-doc/config/http.html#SSL_Support_-_SSLHostConfig获得进一步的帮助

此外,defaultSSLHostConfigName非常重要,否则它无法运作。选择任何一个域作为默认域。

答案 2 :(得分:1)

您可以在tomcat前面安装nginx / haproxy(两者都支持SNI),它们将充当代理。