在Tomcat 7中使用多个SSL证书

7
我一直在使用Apache Tomcat 7中的通配符SSL证书。但现在我需要续订,我发现有这些扩展验证(EV)SSL证书,浏览器会显示一个漂亮的绿色条形,这样用户会感觉更好。这对我的网站很重要,所以我想要它!但是我有多个子域名,显然EV SSL证书本质上不支持通配符。所以好吧,我有一定数量的子域名,我可以为每个子域名购买一堆(我肯定至少需要2个)EV SSL证书。

我能否在Tomcat 7中设置这样一个配置:一个Web应用程序上有多个SSL证书?将多个IP地址分配给此计算机对我来说不是问题。

5个回答

11

如果没有使用Server Name Indication(SNI),在Java(6)中不支持,那么每个IP地址需要一个证书。

您可以配置Tomcat使用多个连接器,具有不同的IP地址和证书,使用address属性

例如:

<Connector 
       port="8443" maxThreads="200" address="10.0.0.1"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="keystore1.jks" keystorePass="..."
       clientAuth="false" sslProtocol="TLS"/>
<Connector 
       port="8443" maxThreads="200" address="10.0.0.2"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="keystore2.jks" keystorePass="..."
       clientAuth="false" sslProtocol="TLS"/>

如果需要的话,您也可以使用相同的密钥库,并使用keyAlias属性(在Connector中)告诉连接器要使用哪个密钥/证书(基于密钥库中的别名名称)。


完美,正是我想要的。还没有尝试过,会让你知道它的运行效果如何。 - at.
兄弟,可以设置域名而不是IP地址吗? - user2889419
嗨@布鲁诺,我在想,是否可以在地址属性中使用域名而不是IP地址?因为我托管了许多网站,但它们都属于同一个IP地址。 - Chor Wai Chun
@ChorWaiChun 我认为你唯一的选择就是使用不同的端口。 - Ahatius

3

我不确定,“SNI”是否真的相关。

但是在您的情况下,典型的解决方案将是所谓的“ssloffloading”或“ssl终止”: 即将您的tomcat放在一个apache后面,该apache配置为在同一IP上使用多个虚拟主机/域名。您可以在apache中为每个虚拟主机配置自己的SSL证书。

这里有一个逐步指南来介绍这个主题:

http://milestonenext.blogspot.de/2012/09/ssl-offloading-with-modjk-part-1.html


3

我正在使用 Tomcat 8.5,现在可以配置多个 SSL/ 多域名的 Tomcat。以下是我的配置:

    <Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
           defaultSSLHostConfigName="localhost" >

    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig hostName="localhost">
        <Certificate certificateKeyFile="/$path/privkey.pem"
                     certificateFile="/$path/certificate.pem"
                     certificateChainFile="/$path/chain.pem"
                     type="RSA" />
    </SSLHostConfig>
       <SSLHostConfig hostName="domainname.com">
        <Certificate certificateKeyFile="/$path/privkey.pem"
                     certificateFile="/$path/certificate.pem"
                     certificateChainFile="/$path/chain.pem"
                     type="RSA" />
    </SSLHostConfig>

</Connector>

1
你可以选择更简单的方式,使用EV SAN(也称为UCC),并将每个域名作为主题备用名称字段中的一个条目添加。如果想要使用多个IP地址,只需导出证书并重新导入到每个IP地址上(如果您正在运行Windows,则可使用http://www.ssltools.com/manager)。一个好的EV SAN证书的例子是在https://www.ssl.com找到的证书,可以仔细查看它。

1

我刚刚在一个拥有多个SSL和IP的服务器上使其工作

通过以下方式添加IP:
http://www.loadtestingtool.com/help/how-setup-ip.shtml

添加了代码以使用“密码”(具有2048位密钥时)使服务器使用最大可能的安全性。

首先测试了这将如何使用自签名密钥:
http://community.jboss.org/wiki/GeneratingSelfSignedCertificateWithKeytool
请注意,此页面中的测试在“-keystore”文本的开头(多个位置)中有错误字符。

以下是代码:

<Connector protocol="org.apache.coyote.http11.Http11Protocol" address="###.###.###.##1" port="443" minSpareThreads="5"
    enableLookups="true" acceptCount="100" maxThreads="200"
    scheme="https" secure="true" SSLEnabled="true" keystoreFile="key1.key"
    keystorePass="password1" clientAuth="false" sslProtocol="TLS"
    ciphers="SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"/>

<Connector protocol="org.apache.coyote.http11.Http11Protocol" address="###.###.###.##2" port="443" minSpareThreads="5"
    enableLookups="true" acceptCount="100" maxThreads="200"
    scheme="https" secure="true" SSLEnabled="true" keystoreFile="key2.key"
    keystorePass="password2" clientAuth="false" sslProtocol="TLS"
    ciphers="SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"/>

嗨@Zuul,我在想,是否可以在地址属性中使用域名而不是IP地址?因为我托管了许多网站,但它们都属于同一个IP地址。 - Chor Wai Chun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接