9

根据这两个答案[1] [2]Apache Tomcat ,可以使用服务器名称指示 (SNI)从相同的服务器提供两个 SSL 证书。

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

在使用 SNI 时,我如何告诉 tomcat 他必须使用哪个 SSL 证书(或者更准确地说是哪个密钥库)?

[1] https://stackoverflow.com/a/10173447
[2] https://stackoverflow.com/a/6343059

4

3 回答 3

16

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

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

截至 2014 年 12 月的更新:

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

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

截至 2015 年 6 月的更新:

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

TLS 配置已显着更改以支持 SNI。构建 Tomcat 9 后,详细信息将在 docs Web 应用程序中。

截至 2016 年 11 月的更新:

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

于 2013-11-29T14:26:40.423 回答
8

您可以使用以下配置设置多个 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这非常重要,否则它将无法正常工作。选择任何一个域作为默认值。

于 2017-08-21T18:23:21.830 回答
1

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

于 2015-02-20T13:20:57.453 回答