我有一个网络应用,允许用户上传pkcs12。我将pkcs12存储为数据库中的二进制文件。有没有办法让我知道pkcs12中的证书是自签名还是CA签名?
我正在tomcat上运行一个Java Web应用程序并且可以使用openssl。
答案 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)