查找证书是自签名的还是 CA 签名的

2022-09-01 22:38:00

我有一个Web应用程序,允许用户上传pkcs12。我将pkcs12作为二进制文件存储在数据库中。有没有办法让我知道 pkcs12 中的证书是自签名的还是 CA 签名的?

我正在tomcat上运行一个Java Web应用程序,并有openssl可供我使用。


答案 1

以下电子邮件线程准确地告诉了验证base64编码证书(即PEM)是否自签名的正确方法:http://marc.info/?l=openssl-users&m=116177485311662&w=4

以下是代码片段:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

应返回:

self_signed_cert.pem: OK

或者比较发行人和主题。如果它们相同,则为自签名

openssl x509 -in cert.pem -inform PEM -noout -subject -issuer

答案 2

编辑:今天这个问题有两个更好的答案:

但是,我认为还有更重要的问题需要解决 - 为什么人们想知道自签名证书。目标是什么?正在解决什么问题?对于大多数情况,尝试将证书分成两堆(自签名和非自签名)可能是错误的方法。几乎可以肯定的是,更好的方法是验证任何给定的证书是否具有来自受信任的证书颁发机构的有效签名链,以及与给定证书关联的任何连接是否与证书匹配。

这是我最初答案的其余部分。这可能不是你想要的。


这有点黑客,但该命令可以同时报告颁发者和主题。如果主题和发行人相同,则为自签名;如果它们不同,那么它是由CA签名的(严格来说,许多自签名证书由CA自己签名。openssl x509

在测试这个理论时,我进行了一些测试;它运行如下内容:

cd /etc/ssl/certs
for f in *.0 ; do openssl x509 -in $f -issuer | head -1 > /tmp/$f.issuer ; openssl x509 -in $f -subject | head -1 > /tmp/$f.subject ; done
 cd /tmp
 sed -i -e s/issuer=// *.issuer
 sed -i -e s/subject=// *.subject
 cd /etc/ssl/certs/
 for f in *.0 ; do diff -u /tmp/$f.issuer /tmp/$f.subject ; done

希望这有帮助。


推荐