Tomcat 使用多个 SSL 证书托管多个虚拟主机

Tomcat hosting multiple virtual host with multiple SSL certificate

我有一个服务器使用 Tomcat 7 托管多个网站,例如

使用 tomcat 的虚拟主机功能,因此它们可能属于不同的 webapps 文件夹。

我们现在正在尝试对每个站​​点实施 Https。所以基本上我们得到了 2 个通配符证书,*.abc.com 和 *.def.com

我一直在寻找设置的方法,我发现:

第二个例子最接近我的需要,但问题是我所有的虚拟主机都具有相同的 IP 地址,唯一的区别在于域名本身,更糟糕的是它们中的大多数甚至有几个不同的别名(例如:我的 d.def.com 可以将 e.ghi.com 作为其别名之一)。

所以我的问题是,我是否可以为所有虚拟主机设置多个 SSL 证书?

恐怕 tomcat 无法满足您的所有要求:

  • 多个域
  • 两个 SSL 证书
  • 唯一的 IP 地址
  • 标准 SSL 端口(我假设它)

Tomcat SSL 配置在 config.xml

<Connector> 元素中定义
<Connector
       protocol="org.apache.coyote.http11.Http11NioProtocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="${user.home}/.keystore" keystorePass="changeit"
       clientAuth="false" sslProtocol="TLS"/>

每个连接器都需要一个 port 属性。请参阅 HTTP Connector 文档中的定义

The TCP port number on which this Connector will create a server socket and await incoming connections. Your operating system will allow only one server application to listen to a particular port number on a particular IP address.

因此您不能使用同一个端口定义两个连接器,也就不可能配置不同的 SSL 证书。

备选方案

  • Several IP's: address 属性配置哪个地址将用于侦听指定端口。使用 SSL 证书为每个主域设置 IP 并为其配置 Connector

  • 不同端口443 for *.abc.com,444 for *.def.com , 依此类推

  • SSL Proxy: 在tomcat前面部署Apache或Nginx等代理服务器。代理只处理 SSL 协商和虚拟主机。所有流量都以普通 HTTP 重定向到 Tomcat。

作为使用 Apache mod_ssl + and the tomcat connector mod_JK 的示例,您请求的配置很简单

listen 443

<VirtualHost *:443>
    ServerName a.abc.com:443
    SSLEngine on
    SSLProtocol all -SSLv2 
    SSLCertificateFile "/home/certs/abc.com.crt"
    SSLCertificateKeyFile "/home/certs/abc.com.key"
    SSLCertificateChainFile  "/home/certs/abc.com.ca-bundle"
    SSLOptions +StdEnvVars  +ExportCertData 
    ErrorLog "/var/logs/error_abc_443.log"
    TransferLog "/var/logs/error_abc_443.log"
    JkMount  /* worker1

</VirtualHost>


<VirtualHost *:443>
    ServerName c.def.com:443
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCertificateFile "/home/certs/def.com.crt"
    SSLCertificateKeyFile "/home/certs/def.com.key"
    SSLCertificateChainFile  "/home/certs/def.com.ca-bundle"
    SSLOptions +StdEnvVars  +ExportCertData
    ErrorLog "/var/logs/error_def.log"
    TransferLog "/var/logs/error_def.log"
    JkMount  /* worker2
</VirtualHost>