Ubuntu 上如何列出系统信任的所有 CA 证书?
系统 CA 证书合集在 /etc/ssl/certs/ca-certificates.crt;用 awk + openssl 逐张列出 subject;单张查看用 openssl x509 -text;查看某网站实际发来的证书链用 openssl s_client -showcerts。本文给出命令。
列表命令:系统的 CA 信任库合集文件在 /etc/ssl/certs/ca-certificates.crt(多张证书拼接的 PEM 文件)。逐张打印 subject 的一行流:
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt | \
openssl pkcs7 -print_certs -noout
其他常用查看方式
# 目录视图(每张证书一个软链)
ls /etc/ssl/certs/ | head -20
# 查看某一张的完整信息(有效期、签发者、指纹)
openssl x509 -in /etc/ssl/certs/ISRG_Root_X1.pem -noout -text | less
# 只看有效期
openssl x509 -in /etc/ssl/certs/xxx.pem -noout -dates
查看服务器实际发来的证书链
排查"系统里有根证书但还是报不受信"时,问题常在服务端没发中间证书。看对方实际发来的链:
openssl s_client -showcerts -connect example.com:443 </dev/null
输出里 Certificate chain 一节列出服务端发来的每一张;缺中间证书就要在服务端补 fullchain。
增删自定义 CA
# 验证来源/指纹后添加企业 CA;每个 .crt 文件放一张 PEM 证书
sudo cp my-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# 删除:从该目录移除后再 update-ca-certificates --fresh
常见问题(FAQ)
Q:ca-certificates.crt 和 /etc/ssl/certs/ 目录什么关系?
A:目录里是逐张证书(软链),.crt 合集是它们的拼接版,多数程序用合集,部分 OpenSSL 客户端使用哈希证书目录;Java 通常使用自己的 truststore,不是直接读取此目录。
Q:更新 CA 列表的包叫什么?
A:ca-certificates 包,sudo apt install --reinstall ca-certificates 可修复损坏的信任库。
Q:Java 应用不认系统 CA?
A:先检查实际 JVM、javax.net.ssl.trustStore 与应用自定义 SSLContext;Ubuntu 的 ca-certificates-java 可同步系统信任到 Java 存储,但并非所有 JVM 都使用它,必要时才向目标 truststore 导入。