用户在部署SSL证书前必须检查清单:有5个必需做的步骤
第一步:验证域名与服务器对应关系
核心问题:证书上的域名是否解析到当前要部署的服务器?
必做检查:
域名解析验证
bash
检查A记录解析
dig +short yourdomain.com
dig +short www.yourdomain.com
或使用nslookup(Windows)
nslookup yourdomain.com
服务器IP确认
bash
查看服务器公网IP
curl ifconfig.me
或
ip addr show | grep 'inet.*global'
预期结果:域名解析的IP必须与服务器公网IP一致。
第二步:检查443端口(HTTPS)可用性
核心问题:服务器是否开放了HTTPS服务端口?
必做检查:
本地端口监听检查
bash
检查443端口是否被监听
sudo netstat -tlnp | grep :443
或
sudo ss -tlnp | grep :443
查看哪个进程在监听
sudo lsof -i :443
外部网络连通性测试
bash
从外部测试端口(使用另一台服务器)
nc -zv yourdomain.com 443
或使用在线工具:https://www.yougetsignal.com/tools/open-ports/
常见问题处理:
如果端口未监听:需要先配置Web服务器(Nginx/Apache)
如果被防火墙拦截:开放防火墙规则
云服务器需检查安全组/网络ACL规则
第三步:验证证书文件与私钥匹配
核心问题:证书和私钥是否配对?这是最常见的部署失败原因。
必做检查:
私钥与证书指纹匹配检查
bash
提取证书的MD5指纹
openssl x509 -noout -modulus -in your_certificate.crt | openssl md5
提取私钥的MD5指纹
openssl rsa -noout -modulus -in your_private.key | openssl md5
提取CSR的MD5指纹(如需验证)
openssl req -noout -modulus -in your_request.csr | openssl md5
预期结果:三个命令的输出必须完全一致。
快速一键检查脚本:
bash
/bin/bash
CRT_MOD=$(openssl x509 -noout -modulus -in $1 | openssl md5)
KEY_MOD=$(openssl rsa -noout -modulus -in $2 | openssl md5)
if [ "$CRT_MOD" = "$KEY_MOD" ]; then
echo "证书和私钥匹配成功"
else
echo "证书和私钥不匹配!"
fi
bash
使用方法
./check_match.sh certificate.crt private.key
第四步:验证证书链完整性
核心问题:是否包含了所有必要的中间证书?
必做检查:
本地证书链验证
bash
验证证书链(需下载中间证书)
openssl verify -CAfile intermediate.crt your_certificate.crt
查看证书详情,确认签发者
openssl x509 -in your_certificate.crt -text -noout | grep -A1 "Issuer"
在线快速验证
使用 SSL Labs SSL Test
使用 SSL Checker
关键看是否有"Chain issues"警告
证书链文件正确格式:
bash
正确的fullchain.pem文件内容顺序:
1. 你的域名证书
2. 中间证书1
3. 中间证书2(如果有)
cat your_certificate.crt intermediate.crt > fullchain.pem
第五步:准备Web服务器配置
核心问题:配置文件是否正确引用证书文件路径?
必做检查:
文件权限检查
bash
私钥必须严格保护
chmod 400 /path/to/private.key
chown root:root /path/to/private.key
证书文件只读权限
chmod 644 /path/to/fullchain.crt
配置文件语法预检
bash
Nginx配置检查
sudo nginx -t
Apache配置检查
sudo apachectl configtest
配置备份与回滚计划
bash
备份原配置文件
cp /etc/nginx/conf.d/your-site.conf /etc/nginx/conf.d/your-site.conf.backup
准备回滚命令
echo "回滚命令:sudo systemctl restart nginx"
部署前快速自测脚本
将以下脚本保存为 pre_deploy_check.sh:
bash
/bin/bash
DOMAIN="yourdomain.com"
CERT="/path/to/fullchain.crt"
KEY="/path/to/private.key"
echo "=== SSL证书部署前检查 ==="
echo ""
1. 检查域名解析
echo "1. 检查域名解析..."
IP=$(dig +short $DOMAIN | head -1)
SERVER_IP=$(curl -s ifconfig.me)
if [ "$IP" = "$SERVER_IP" ]; then
echo "域名解析正确: $DOMAIN -> $IP"
else
echo " 域名解析错误!"
echo " 解析IP: $IP"
echo " 服务器IP: $SERVER_IP"
fi
2. 检查443端口
echo -e "\n2. 检查443端口..."
if nc -zv $DOMAIN 443 2>&1 | grep -q "succeeded"; then
echo "443端口可访问"
else
echo "443端口不可访问"
fi
3. 检查证书私钥匹配
echo -e "\n3. 检查证书私钥匹配..."
CERT_HASH=$(openssl x509 -noout -modulus -in $CERT | openssl md5 | cut -d' ' -f2)
KEY_HASH=$(openssl rsa -noout -modulus -in $KEY 2>/dev/null | openssl md5 | cut -d' ' -f2)
if [ "$CERT_HASH" = "$KEY_HASH" ] && [ -n "$CERT_HASH" ]; then
echo "证书和私钥匹配"
else
echo " 证书和私钥不匹配!"
fi
4. 检查证书有效期
echo -e "\n4. 检查证书有效期..."
NOT_AFTER=$(openssl x509 -in $CERT -noout -enddate | cut -d= -f2)
echo " 证书过期时间: $NOT_AFTER"
5. 检查文件权限
echo -e "\n5. 检查文件权限..."
KEY_PERM=$(stat -c "%a" $KEY)
if [ "$KEY_PERM" -le 400 ]; then
echo "私钥权限正确: $KEY_PERM"
else
echo " 私钥权限过宽: $KEY_PERM (建议设为400)"
fi
echo -e "\n=== 检查完成 ==="
使用方法:
bash
chmod +x pre_deploy_check.sh
./pre_deploy_check.sh
最后确认清单(部署前5分钟)
在最后执行部署前,请口头确认:
“我已经备份了原配置和原证书”
“我的证书和私钥哈希完全匹配”
“我的域名解析已生效并指向正确服务器”
“我的防火墙已开放443端口”
“我已准备好回滚方案和监控告警”
关键建议:首次部署请在非高峰时段进行,并设置5分钟监控窗口,部署后立即访问并检查浏览器控制台有无证书错误。
用户完成这五项检查,用户的SSL证书部署成功率将超过95%。