如何用Linux命令行检查证书链并排查缺失的信任证书
证书信任判断与Let's Encrypt证书链排查指南
一、从openssl x509 -in certificate.pem -text输出判断证书是否受信任
仅靠这个命令的输出无法100%确定证书是否被本地系统信任,但可以通过以下关键点验证证书本身的合法性和链逻辑:
- 追溯签发链:查看
Issuer(签发CA)和Subject(证书持有者)字段。如果两者一致,这是根CA证书,需要确认本地信任存储中是否包含它;如果不一致,说明是中间CA或服务器证书,必须能往上追溯到已被信任的根CA才算有效。 - 检查签名算法:看
Signature Algorithm字段,避免使用SHA1等已被弃用的算法,这类算法的证书会被现代系统拒绝信任。 - 确认有效期:在
Validity段中,确保当前时间处于Not Before和Not After之间,过期或未生效的证书直接不被信任。 - 验证扩展字段:
X509v3 Basic Constraints:CA证书会显示CA:TRUE,服务器证书则为CA:FALSE;中间CA还会标注Path Length Constraint,限制其签发下级证书的层级。X509v3 Subject Alternative Name:确保你要访问的域名在这个字段的列表内,否则会触发域名不匹配的信任错误。X509v3 Authority Key Identifier与X509v3 Subject Key Identifier:上级CA的Subject Key Identifier必须和当前证书的Authority Key Identifier一致,以此验证证书链的连贯性。
注意:最终的信任判定还是要看本地系统的信任存储是否包含链顶端的根CA,这个命令只能帮你排查证书本身的属性问题。
二、Let's Encrypt证书链缺失的本地排查方法
针对tls: failed to verify certificate: x509: certificate signed by unknown authority这类错误,可通过以下步骤高效排查:
- 直接验证服务器返回的证书链:执行命令
openssl s_client -connect 目标域名:443 -servername 目标域名,输出中会列出服务器返回的完整证书链。如果链中缺少中间CA,会看到Verify return code: 21 (unable to verify the first certificate)的提示。 - 对比标准Let's Encrypt证书链:Let's Encrypt的服务器证书必须搭配对应中间CA(如R3、E1)才能被信任。将本地持有的证书与服务器返回的链对比,确认是否遗漏了中间CA文件。
- 检查本地信任存储:
- Linux:查看
/etc/ssl/certs/或/usr/local/share/ca-certificates/目录,确认ISRG Root X1(Let's Encrypt的根CA)存在且未过期;旧系统可能仍使用已过期的DST Root CA X3,需要更新。 - Windows:通过
certmgr.msc打开证书管理器,检查“受信任的根证书颁发机构”中是否有ISRG Root X1。 - macOS:打开“钥匙串访问”,搜索ISRG Root X1,确认它在“系统根证书”列表中且状态为信任。
- Linux:查看
- 验证本地证书链完整性:将服务器证书与中间CA证书合并为一个PEM文件,执行
openssl verify -CAfile 本地信任根CA.pem 合并后的证书链.pem。如果验证通过,说明链完整;失败则会提示具体的缺失环节。 - 排查客户端证书加载逻辑:比如Go语言客户端,要确认代码是否正确加载了系统根证书池,或是否手动指定了包含完整链的CA文件。如果是自定义CA池,需确保根CA或中间CA已被正确添加。
内容的提问来源于stack exchange,提问作者xrfang
相关产品推荐
相关产品推荐

