有时候在浏览器里访问服务器,突然弹出“证书无法验证”或者“您的连接不是私密连接”的警告,心里一万个草泥马都跑出来了:到底哪错了?本期小编带你逐步排查,从根证书到配置细节,让证书验证问题迎刃而解!
服务器证书无法验证怎么办
一、检查系统和浏览器的根证书
- 根证书过期或缺失
- Windows/macOS:检查系统的证书管理工具(如
certmgr.msc
、钥匙串访问),确认是否安装了颁发机构(CA)的根证书。 - 浏览器:某些浏览器自带证书库,若版本过旧,可能缺少最新根证书。更新浏览器后重试。
- Windows/macOS:检查系统的证书管理工具(如
- 自签名证书
- 自己给服务器签发的证书(self-signed)不会在内置根证书列表中,需要手动导入到客户端信任列表,否则始终报错。
二、确认证书链是否完整
- 查看中间证书
- 访问
https://your.server.com
,在浏览器中点击锁形图标,查看证书路径,确认是否有缺失的中间证书。
- 访问
- 服务器端配置
- 将中间证书拼接到同一个文件,例如:
cat server.crt intermediate.crt > fullchain.crt
- 在 Nginx/Apache 中使用
fullchain.crt
而非单独的server.crt
。
- 将中间证书拼接到同一个文件,例如:
三、确保证书和私钥匹配
- 校验证书与私钥
openssl x509 -noout -modulus -in server.crt | openssl md5 openssl rsa -noout -modulus -in server.key | openssl md5
两个 MD5 值应一致,否则使用了错误的私钥或证书。
- 格式与权限
- 确认证书和私钥文件编码为 PEM(Base64),不要混用 DER 或 PFX。
- 检查文件权限,私钥文件权限应设置为 600,防止非 root 用户读取。
四、检查服务器配置
- Nginx 示例
ssl_certificate /etc/nginx/ssl/fullchain.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;
- Apache 示例
SSLCertificateFile /etc/httpd/ssl/fullchain.crt SSLCertificateKeyFile /etc/httpd/ssl/server.key SSLCertificateChainFile /etc/httpd/ssl/intermediate.crt
常见问题解答
- Q1:浏览器依然报“NET::ERR_CERT_AUTHORITY_INVALID”?
A:确认中间证书已正确安装,或将自签名根证书导入系统/浏览器信任。 - Q2:手机访问也验证失败?
A:手机证书库不同,同样需要手动信任根证书,或使用公共 CA 签发的证书(Let’s Encrypt、ZeroSSL)。 - Q3:升级到 TLS 1.3 会影响旧设备兼容吗?
A:部分老设备/浏览器不支持 TLS 1.3,可在配置中同时保留 TLSv1.2。