我有一台配置为使用 Apach 2.4 动态配置 vhosts 的服务器。我为一些域配置了 SSL,但我被要求使用 Let's Encrypt 免费服务为所有域提供 SSL。
Certbot对我来说有点不清楚,因为我不确定它是否适用于动态虚拟主机。
我的挑战是,每个域名都有一个子域名 subXXX.masterdomain.com 和一个别名 yourchoicedomain.com,因此我需要生成一个有效的 Let's Encrypt 证书
- subXXX.masterdomain.com
- www.subXXX.masterdomain.com
- yourchoicedomain.com
- www.yourchoicedomain.com
我没有非常复杂的 vhosts 配置文件,我使用符号链接实现域别名和 www 服务器别名。
<VirtualHost *:80>
#ServerName masterdomain.me
#ServerAlias *
# get the server name from the Host: header
UseCanonicalName Off
# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot "/var/www/vhosts/%0/httpdocs"
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS} off
RewriteRule .* http://www.%{HTTP_HOST}$0 [R=301,L]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS} on
RewriteRule .* https://www.%{HTTP_HOST}$0 [R=301,L]
<Directory "/var/www/vhosts/*/httpdocs">
AllowOverride "All"
Options SymLinksIfOwnerMatch
Require all granted
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
任何帮助我开始的帮助都将非常有用。
答案1
由于 certbot 无法从您的 Apache 配置中确定活动域名,因此您需要解决这个问题。
由于mod vhost alias
子目录的存在就是“激活”域名的原因我建议使用一个简单的 shell 脚本来枚举所有子目录(=所有活动域),然后使用以下命令运行 certbot--webroot
选择创建类似以下内容的内容:
certbot certonly --webroot -w var/www/vhosts/www.example.com/httpdocs -d www.example.com -d example.com -w var/www/vhosts/www.example.net/httpdocs -d www.example.net -d other.example.net
答案2
Certbot 需要目录名称和域名。根据其文档,您最多可以添加 100 个,但目前还不支持通配符。
您只需要将 SSL 相关配置添加到 vhost 别名(单个配置文件),但您可以对 vhost 上提到的所有域使用相同的证书。
单个配置文件仍然可以为我工作。已试用并测试。