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

时间:2012-04-25 03:20:36

标签: java openssl ssl-certificate pki

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

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

5 个答案:

答案 0 :(得分:12)

以下电子邮件主题确切地说明了验证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

答案 1 :(得分:9)

有点hacky,但openssl x509命令可以报告发行者和主题。如果主题和发行人是相同的,则是自签名的;如果它们不同,则由CA签署。 (严格来说,许多自签名证书由CA签署 - 他们自己。)

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

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

希望这有帮助。

答案 2 :(得分:3)

这里接受的答案严格来说是不正确的。旧问题,但这是google中“如何分辨证书是否为自签名”的第一个结果,因此需要清除。

如果颁发者和主题匹配,则证书几乎总是自签名的,但不能保证。证书可以具有相同的颁发者/主题,但可以通过“私钥”签名,该私钥与证书中的公钥不匹配。

上面NitinB回答的第一部分是检查自签名证书的正确方法:

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

“所有自签名证书都是自发行的,但并非所有自发行证书都是自签名的。”

引用:https://tools.ietf.org/html/rfc5280

“自颁发证书是其中颁发者和主题是同一实体的CA证书。生成自颁发证书以支持策略或操作的更改。自签名证书是自颁发证书,其中可以进行数字签名由绑定到证书的公钥进行验证。”

答案 3 :(得分:0)

您是否尝试过BouncyCastle库?

http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

” 有用于处理属性证书,PKCS12,SMIME和OpenPGP的特定示例程序。它们可以在包中找到:

org.bouncycastle.jce.examples org.bouncycastle.mail.smime.examples org.bouncycastle.openpgp.examples 另一个有用的示例来源是测试包:

org.bouncycastle.crypto.test org.bouncycastle.jce.provider.test org.bouncycastle.cms.test org.bouncycastle.mail.smime.test org.bouncycastle.openpgp.test org.bouncycastle.cert.test org.bouncycastle.pkcs.test org.bouncycastle.tsp.test “

答案 4 :(得分:0)

Java无法分析PKCS12,因此您必须使用openssl将其转换为密钥库。 密钥库中有私钥和X509证书(或者您只能选择存储证书)。然后使用标准JAVA API从密钥库获取颁发者并手动验证颁发者。