根据这两个答案(1)(2),可以使用服务器名称指示(SNI)从同一个tomcatserver提供两个ssl证书。
我的问题是,如何设置? 我可以设置两个虚拟主机,但我仍然只有一个连接器向客户端提供指定的ssl证书。在连接器中,可以指定用于证书的密钥库和别名,但是没有参数说明此连接器用于哪个虚拟主机,或者根据使用的域应该向客户端提供哪个证书。
如何告诉tomcat在使用SNI时他必须使用哪个ssl证书(或更正确的哪个密钥库?)
(1)https://stackoverflow.com/a/10173447 (2)https://stackoverflow.com/a/6343059
答案 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),它们将充当代理。