我使用 Apache VirtualHost 在单个 IP 地址上运行 2500 个公共域(例如 www.example.com、example.com、www.example.net 和 example.net)。
我想为所有这些域设置 LetsEncrypt。推荐的方法是什么?有自动化工具可以做到这一点吗?
解决方案应该是:
- 事实证明有效(不是猜测)
- 完全的
- 在单个 IP 上工作
我的部分的活动部分<VirtualHost>
如下所示:
<VirtualHost *:80>
# www.sub.example.com -> sub.example.com/html/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(www\.)?(.*)
RewriteRule ^/(.*)$ /home/hotels/%2/html/$1
</VirtualHost>
答案1
首先,您需要Apache v2.2.12
或稍后OpenSSL v0.9.8j
使用 SNI 在单个 IP 地址上支持多个 SSL 证书。在继续之前,请检查您的服务器并验证 Apache Web 服务器的版本。如果您的机器不支持这些或更高版本,您将需要升级。
Digicert 有一篇很好的文章在 Apache 中通过一个 IP 地址使用多个 SSL 证书
如前所述,您需要为每个域创建一个单独的虚拟主机。每个虚拟主机都有自己的 SSL 证书配置。让我们加密将允许您使用通配符或多服务器规范为每个域创建一个 SSL 证书certbot
数字海洋有一篇文章如何设置 Let's Encrypt 证书其中还包括certbot
在 Ubuntu 上安装。如果你的服务器不是 Ubuntu 那么获取来自 certbot 的安装说明。此外,您可能需要让我们加密文档
您可以使用以下指令通过 certbot 为每个域创建 SSL 证书:
certbot --apache -d example.com -d www.example.com
certbot --apache -d example.net -d www.example.net
请注意,每个命令适用于不同的域,但每个域可以有多个主机名。
在您的 apache 配置中,您为每个域创建一个虚拟主机
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/site
SSLEngine on
SSLCertificateFile /path/to/www_example_com.crt
SSLCertificateKeyFile /path/to/www_example_com.key
SSLCertificateChainFile /path/to/LetsEncrypt.ca
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.net
ServerAlias example.net
DocumentRoot /var/www/site2
SSLEngine on
SSLCertificateFile /path/to/www_example_net.crt
SSLCertificateKeyFile /path/to/www_example_net.key
SSLCertificateChainFile /path/to/LetsEncrypt.ca
</VirtualHost>
根据您收到的证书类型和 Apache 的版本,您可能必须指定实际的 IP 地址<VirtualHost 192.168.1.3:443>
而不是<VirtualHost *:443>
保持端口 80 虚拟主机<VirtualHost *:80>
完好无损,以支持非 SSL 入站流量。您需要创建多达 2500 个虚拟主机来支持 SSL。在投入之前,先测试一两个。
不要忘记启用 Apache SSL 模块
a2enmod ssl
答案2
避免维持2500个人<VirtualHost>
的目光https://github.com/varnish/hitch/blob/master/docs/vhosts.md
将证书放入/home/hotels/*/certs/
:
./hitch --backend=localhost:80 \
--frontend=[*]:443 \
/home/hotels/*/certs/*.pem
(未经测试)。