下面我说一下,SSL证书不匹配特定域名的故障模拟与解决方案

故障场景模拟

1. 常见错误表现

浏览器警告:

"此网站的安全证书存在问题"

"证书不匹配:此证书仅对以下域名有效:[其他域名]"

"NET::ERR_CERT_COMMON_NAME_INVALID"

2. 故障原因分析

原因 描述 

证书绑定域名错误 证书为 www.domain.com 但访问的是 domain.com 

多域名配置不全 SAN(主题备用名称)未包含所有使用域名 

服务器配置错误 Web服务器配置指向了错误的证书文件 

DNS解析问题 CDN、负载均衡器使用了错误的证书 

证书链不完整 中间证书缺失导致验证失败 

故障排查流程

bash

1. 使用OpenSSL检查证书详情

openssl s_client -connect example.com:443 -servername example.com | openssl x509 -text -noout

2. 检查证书的Subject Alternative Names

openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -text -noout | grep -A1 "Subject Alternative Name"

3. 使用在线工具验证

SSL Labs: https://www.ssllabs.com/ssltest/

SSL Checker: https://www.sslshopper.com/ssl-checker.html

4. 检查Web服务器配置

Apache

apachectl -S

cat /etc/httpd/conf.d/ssl.conf | grep -i "sslcertificate"

Nginx

nginx -T

cat /etc/nginx/sites-enabled/ssl-site | grep -i "ssl_certificate"

解决方案

方案1:更新证书包含正确域名

bash

使用Let's Encrypt为多个域名生成证书

certbot certonly --webroot -w /var/www/html \

  d example.com \

  d www.example.com \

  d api.example.com \

  d subdomain.example.com

方案2:配置Web服务器重定向

Nginx配置示例:

nginx

将非www重定向到www(当证书只包含www时)

server {

    listen 80;

    listen 443 ssl;

    server_name example.com;

    # 使用包含www的证书

    ssl_certificate /etc/ssl/certs/www.example.com.crt;

    ssl_certificate_key /etc/ssl/private/www.example.com.key;

    # 301重定向到www版本

    return 301 https://www.example.com$request_uri;

}

server {

    listen 443 ssl;

    server_name www.example.com;

    ssl_certificate /etc/ssl/certs/www.example.com.crt;

    ssl_certificate_key /etc/ssl/private/www.example.com.key;

    # 主站点配置

}

Apache配置示例:

apache

<VirtualHost *:443>

    ServerName example.com

    ServerAlias www.example.com

    # 确保证书包含两个域名

    SSLEngine on

    SSLCertificateFile /etc/ssl/certs/example.com.crt

    SSLCertificateKeyFile /etc/ssl/private/example.com.key

    SSLCertificateChainFile /etc/ssl/certs/chain.pem

    # 如果证书只包含一个域名,使用重定向

    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^example\.com$

    RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]

</VirtualHost>

方案3:使用通配符证书

bash

申请通配符证书

certbot certonly --manual --preferred-challenges=dns \

  -d "*.example.com" \

  -d example.com

方案4:修复SAN(主题备用名称)扩展

如果证书缺少必要的域名,需要重新申请包含所有使用域名的证书:

bash

创建包含SAN的CSR配置文件

cat > san.cnf << EOF

[req]

default_bits = 2048

prompt = no

default_md = sha256

req_extensions = req_ext

distinguished_name = dn

[dn]

C = CN

ST = State

L = City

O = Organization

OU = IT Department

CN = example.com

[req_ext]

subjectAltName = @alt_names

[alt_names]

DNS.1 = example.com

DNS.2 = www.example.com

DNS.3 = api.example.com

DNS.4 = subdomain.example.com

EOF

生成CSR

openssl req -new -key private.key -out request.csr -config san.cnf

快速诊断脚本

bash

#!/bin/bash

# ssl-checker.sh

DOMAIN=$1

echo "=== SSL证书诊断报告: $DOMAIN ==="

echo ""

1. 检查DNS解析

echo "1. DNS解析检查:"

dig +short $DOMAIN

echo ""

2. 检查证书详情

echo "2. 证书详情:"

echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | \

  openssl x509 -noout -subject -dates -issuer

echo ""

3. 检查SAN

echo "3. 主题备用名称(SAN):"

echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | \

  openssl x509 -noout -text | grep -A1 "Subject Alternative Name"

echo ""

4. 证书链验证

echo "4. 证书链验证:"

echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN -showcerts 2>/dev/null | \

  grep -E "(Certificate chain|Verify return code)"

echo ""

5. 建议

echo "5. 建议:"

HOSTNAME=$(echo $DOMAIN | awk -F. '{print $(NF-1)"."$NF}')

if [[ $DOMAIN != *"www"* && $DOMAIN == *"$HOSTNAME"* ]]; then

    echo "可能缺少www前缀支持,建议证书同时包含:"

    echo "   - $DOMAIN"

    echo "   - www.$DOMAIN"

fi

预防措施

1. 证书管理最佳实践

   使用自动化工具(如Certbot)管理证书更新

   确保所有生产环境域名都在证书的SAN中

   设置证书到期提醒

2. 配置检查清单

   证书包含所有访问域名

   重定向配置正确处理HTTP和HTTPS

   负载均衡器证书配置正确

   CDN服务使用正确证书

   [测试环境与生产环境证书分离

3. 监控方案

   bash

   # 使用监控工具定期检查证书

   # 示例:Nagios插件检查证书有效期

   check_http --ssl -H example.com -C 30 --sni

   # Prometheus blackbox_exporter配置

   # 监控SSL证书过期时间

4. 应急响应流程

   1. 确认故障范围(哪些域名受影响)

   2. 检查证书配置和有效期

   3. 临时方案:配置重定向到有效域名

   4. 长期方案:更新证书包含所有必要域名

   5. 验证修复:使用多个浏览器和设备测试

   常见工具命令参考

bash

查看证书详细信息

openssl x509 -in certificate.crt -text -noout

检查特定域名证书

openssl s_client -connect example.com:443 -servername example.com

转换证书格式

openssl x509 -in certificate.pem -out certificate.crt

验证证书链

openssl verify -CAfile ca-bundle.crt certificate.crt

检查证书有效期

openssl x509 -in certificate.crt -noout -dates

用户通过以上步骤,可以系统性地诊断和解决SSL证书域名不匹配问题。建议定期检查证书配置,确保所有访问域名都包含在证书中,避免服务中断。