【问题标题】:HowTo setup Tomcat serving two SSL Certificates using SNI?如何使用 SNI 设置 Tomcat 服务两个 SSL 证书?
【发布时间】:2026-02-02 09:50:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: tomcat ssl ssl-certificate sni


    【解决方案1】:

    您需要重新阅读这些问题的答案。在 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 月更新:

    已为 Tomcat 9 实现了 SNI。所有三个 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。

    【讨论】:

    • 这方面有什么进展吗,或者你的回答到今天还是这样?
    • 感谢您的更新。如果 Google 继续推动 SSL 的一切,这对于我们这些穷得无法为每个需要 SSL 的站点创建新的 AWS 服务器实例的人来说将变得更加重要:)
    • 现在显示“5. DONE SNI support for JSSE”。够了吗?
    • 关于如何在一个连接器上为不同域设置不同证书的任何示例?例如,foo.com、bar.com。谢谢
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    您可以使用以下配置设置多个 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 非常重要,否则它不会起作用。选择任何一个域作为默认域。

    【讨论】:

    • 感谢您的提示。没有 defaultSSLHostConfigName 就无法工作
    最近更新 更多