在 Linux 上使用 OpenSSL 时,“不信任(unable to verify the certificate / self signed / unknown issuer)”是非常常见的问题。下面从原理 → 常见原因 → 排查方法 → 解决办法系统说明。
OpenSSL 本身不“信任”任何证书,它依赖:
/etc/ssl/certsca-certificates流程:
服务器证书
↓
中间 CA
↓
根 CA(必须在信任库里)
只要中间某一环找不到或不受信任,OpenSSL 就会报不信任。
例如:
✅ 表现:
verify error:num=20:unable to get local issuer certificate
✅ 解决:
# 将 CA 证书放入
/etc/ssl/certs/
# 更新信任库
update-ca-certificates
OpenSSL 不会自动用系统库,除非你告诉它。
❌ 错误用法:
openssl s_client -connect example.com:443
✅ 正确用法:
openssl s_client -connect example.com:443 -CApath /etc/ssl/certs
或:
openssl s_client -connect example.com:443 -CAfile /etc/ssl/certs/ca-certificates.crt
服务器只发了自己的证书,没发中间 CA。
✅ 表现:
verify error:num=21:unable to verify the first certificate
✅ 解决(服务端):
cat domain.crt intermediate.crt root.crt > fullchain.crt
openssl x509 -in cert.pem -noout -dates
Debian / Ubuntu:
dpkg -l | grep ca-certificates
安装:
apt install ca-certificates
RHEL / CentOS:
yum install ca-certificates
update-ca-trust
例如:
检查:
openssl version
openssl s_client -connect example.com:443 -servername example.com
openssl verify cert.pem
openssl verify -CAfile ca.crt cert.pem
| 错误 | 原因 |
|---|---|
| num=20 | 找不到 issuer |
| num=21 | 证书链不完整 |
| self signed | 根证书不受信任 |
| certificate expired | 过期 |
OpenSSL 不信任,99% 是因为:CA 不在信任库 / 没指定 CA / 证书链不全
如果你愿意,可以:
openssl s_client 输出我可以直接帮你定位是哪一类问题。