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

nex*_*xus 7 ssl tomcat ssl-certificate sni

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

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

我怎样才能告诉tomcat在使用SNI时他必须使用哪个ssl证书(或更正确的哪个密钥库)?

(1)/sf/answers/712141321/ (2) /sf/answers/444014161/

Mar*_*mas 14

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

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

截至2014年12月更新:

在Tomcat 9 的TODO列表中添加SNI支持.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(aka 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.


And*_*ews 6

您可以使用以下配置设置多个 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>
Run Code Online (Sandbox Code Playgroud)

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

此外,defaultSSLHostConfigName非常重要,否则它将无法工作。默认选择任意一个域。