Apache配置求助:Let's Encrypt SSL证书后域名变体连接不安全
你的推测完全正确——问题核心就是仅将HTTP流量重定向到HTTPS,但没有强制指向规范域名,导致部分未在配置中覆盖的域名变体访问时,Apache无法匹配到对应证书,从而触发浏览器的“连接不是私密连接”警告。
问题根源拆解
假设你的规范域名是example.com,当前80端口的配置只覆盖了example.com和www.example.com,但如果用户访问的是比如mail.example.com、blog.example.com或者拼写错误的域名变体,这些请求会被Apache的默认虚拟主机处理(如果没配置覆盖的话),重定向到HTTPS后,由于443端口的配置也没有包含这些域名,Apache会使用不匹配的证书(甚至是默认自签证书),最终导致证书验证失败。
具体解决方案
1. 调整80端口的重定向规则,强制指向规范HTTPS域名
修改你的<VirtualHost *:80>配置,把所有HTTP请求直接重定向到规范域名的HTTPS版本,而不是仅仅转成HTTPS。这样不管用户访问哪个域名变体,都会被统一跳转到你指定的规范地址:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com *.example.com # 列出所有需要覆盖的域名变体,通配符*.example.com可覆盖所有子域名 RewriteEngine On # 若请求的主机名不是规范域名,就重定向到规范HTTPS地址 RewriteCond %{HTTP_HOST} !^example\.com$ [NC] RewriteRule ^(.*)$ https://example.com$1 [L,R=301] # 如果想直接强制所有HTTP请求跳转到规范HTTPS,也可以简化成下面这行(无需上面的RewriteCond) # RewriteRule ^(.*)$ https://example.com$1 [L,R=301] </VirtualHost>
2. 确保443端口的配置覆盖所有必要域名,且证书包含这些域名
检查你的HTTPS虚拟主机配置,确保ServerName和ServerAlias包含所有需要支持的域名,同时Let's Encrypt证书也涵盖这些域名:
<VirtualHost *:443> ServerName example.com ServerAlias www.example.com *.example.com SSLEngine On SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem # 其他HTTPS相关配置(比如HSTS、SSL协议等)... </VirtualHost>
3. 扩展Let's Encrypt证书(如果缺少必要域名)
如果你的证书没有包含所有需要的域名,可以用Certbot扩展证书:
certbot certonly --expand -d example.com -d www.example.com -d *.example.com
执行后会更新你的证书,包含所有指定的域名。
4. 验证配置并重启Apache
修改完配置后,先验证配置是否合法:
apache2ctl configtest
如果输出Syntax OK,就重启Apache使配置生效:
systemctl restart apache2
测试验证
现在尝试访问之前报错的域名变体,比如www.example.com、test.example.com,应该会自动跳转到https://example.com,且浏览器不再提示证书错误。
内容的提问来源于stack exchange,提问作者user2755541

