【问题标题】:Tomcat hosting multiple virtual host with multiple SSL certificateTomcat 托管具有多个 SSL 证书的多个虚拟主机
【发布时间】:2017-04-07 07:07:54
【问题描述】:

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

  • a.abc.com
  • b.abc.com
  • c.def.com
  • d.def.com

使用tomcat的虚拟主机功能,所以它们各自可能属于不同的webapps文件夹。

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

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

  • This 它教我如何使用 tomcat 设置 SSL
  • This 它教会了我如何使用指向不同 IP 地址的不同 SSL 设置多个主机

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

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

【问题讨论】:

  • 嗨 Chor,我已经花了数周时间尝试做这件事。我和你一样有 2 个主机、1 个 Tomcat、1 个 IP,我是新手,有没有关于如何配置 Tomcat、Apache 的详细说明?请帮忙,
  • @Gee 嗨,我可以找到这个examples.javacodegeeks.com/enterprise-java/tomcat/…,这是最接近复制我之前所做工作的指南。这可以帮助您完成第一部分,设置 httpd > modjk > tomcat,完成后,您可以在 httpd 的配置文件中查找有关为每个主机设置多个证书的指南
  • @Gee digicert.com/kb/ssl-support/… 这可能有助于第二部分
  • 问题出在 DocumentRoot,不是 www/html,我所有的文件都位于 Tomcat /data/1/tomcat/webapps/ 下,我收到 403 Forbidden “You don't have permission访问此资源”
  • 我能够使用目录访问我的站点 Require all grant tag,但现在我无法加载我的 servlet,并且 .jsp 显示 标签,我可以为 Apache 解决这个问题吗?

标签: apache tomcat ssl tomcat7 ssl-certificate


【解决方案1】:

恐怕用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 文档中的定义

此连接器将在其上创建服务器套接字并等待传入​​连接的 TCP 端口号。 您的操作系统将只允许一个服务器应用程序侦听特定 IP 地址上的特定端口号

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

替代方案

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

  • 不同的端口443 用于 *.abc.com,444 用于 *.def.com,等等

  • SSL 代理:在 tomcat 前部署 Apache 或 Nginx 等代理服务器。代理仅处理 SSL 协商和虚拟主机。所有流量都以纯 HTTP 的形式重定向到 Tomcat。

作为使用Apache mod_ssl + 和tomcat 连接器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> 

【讨论】:

  • 非常感谢朋友的回答,让我试试这个,必须先研究apache httpd,一旦我完成了肯定会标记为答案=)
  • 好的。随时提出疑问。我用这种方式配置了类似的服务
  • 我刚刚看了很多设置多个tomcat的例子,前面都是httpd处理的。只是想知道,您所展示的实际上是,我可以维护我的一个 tomcat,但丢弃 https 连接器部分,提供 http 就足够了。然后我使用 httpd 监听许多域,在那里提供证书,然后将所有请求转发到我的一个 tomcat 实例。所以最后它只运行了一个 tomcat 实例,我应该保留所有 tomcat 的虚拟主机设置,对吧?
  • 是的。您只需要一个 tomcat 实例。您可以在 tomcat 中维护虚拟主机设置,或将此配置移至 apache httpd。另请注意,您需要在 apache 虚拟主机中配置worker。此文件/文件包含使用 AJP 连接器连接到您的 tomcat 的详细信息
  • 所有站点现在都只用了一个tomcat实例,在httpd配置中配置非常简单,非常感谢队友.. =)
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 2014-06-06
  • 2016-07-27
  • 2014-12-26
  • 2018-08-24
  • 2011-07-10
  • 2011-01-31
  • 2016-11-05
相关资源
最近更新 更多