You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Wildcard SSL证书问题:HTTPS的www域名重定向出现证书错误

为什么会出现证书错误?

你遇到的问题核心是对通配符证书匹配规则的误解,加上SSL握手优先级高于重定向规则的执行顺序:

  1. 通配符证书的匹配限制
    你的*.example.com通配符证书,按照X.509证书标准,只能匹配一级子域名(比如sub.example.comblog.example.com),但无法匹配www.sub.example.com这种二级子域名(也就是子域名的子域名)。*通配符只能替换域名中最左侧的单个标签,不能跨层级匹配。

  2. SSL握手先于重定向执行
    你的Apache配置里,把www.sub.example.com作为sub.example.comServerAlias放在同一个443 VirtualHost中。当用户访问https://www.sub.example.com时,浏览器会先和Apache建立SSL连接,验证证书是否匹配当前访问的域名——这一步发生在任何重定向规则执行之前。因为证书不匹配www.sub.example.com,浏览器直接抛出NET::ERR_CERT_COMMON_NAME_INVALID错误,Rewrite重定向规则根本没机会运行。

解决方法

根据你的需求(强制www转非www+HTTPS),可以采用以下两种方案:

方案1:更新证书以覆盖二级子域名

这是最根本的解决方式:

  • 联系SSL证书提供商,将www.sub.example.com添加为证书的**Subject Alternative Name(SAN)**条目。这样你的通配符证书既能覆盖*.example.com,也能匹配特定的二级子域名www.sub.example.com
  • 或者更换为*.*.example.com的通配符证书,这类证书可以覆盖所有二级子域名(比如www.sub.example.comtest.sub.example.com等),但通常成本更高。

方案2:调整Apache配置,先处理SSL再重定向(需证书支持)

当证书能匹配www.sub.example.com后,你可以优化配置让规则更清晰,确保重定向正常执行:

<VirtualHost *:80>
ServerName sub.example.com
ServerAlias www.sub.example.com
ServerAdmin webmaster@example.com
# 所有HTTP请求直接重定向到HTTPS非www
Redirect permanent / https://sub.example.com/
</VirtualHost>

<VirtualHost *:443>
ServerName sub.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/html/example
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/wildcard.crt
SSLCertificateKeyFile /etc/apache2/ssl/wildcard.key
SSLCertificateChainFile /etc/apache2/ssl/digicert.pem
Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

<VirtualHost *:443>
ServerName www.sub.example.com
ServerAdmin webmaster@example.com

# 单独处理www的HTTPS请求,重定向到非www
RewriteEngine On
RewriteRule ^(.*)$ https://sub.example.com/$1 [R=301,L]

# 这里使用同样的证书(已添加SAN或多级通配符)
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/wildcard.crt
SSLCertificateKeyFile /etc/apache2/ssl/wildcard.key
SSLCertificateChainFile /etc/apache2/ssl/digicert.pem
Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

www.sub.example.com单独拆成一个443 VirtualHost,这样当用户访问https://www.sub.example.com时,Apache会匹配到对应的VirtualHost,先完成SSL握手(证书已匹配),再执行重定向规则,就不会出现证书错误了。

内容的提问来源于stack exchange,提问作者nnv

火山引擎 最新活动