23

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

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

4

5 回答 5

22

以下电子邮件线程准确地告诉了验证 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
于 2013-01-25T05:26:07.657 回答
15

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

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

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


这有点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

希望这可以帮助。

于 2012-04-25T03:50:49.660 回答
7

这里接受的答案并不完全正确。老问题,但这是谷歌“如何判断证书是否为自签名”的第一个结果,因此需要清除。

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

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

openssl verify -CAfile self_signed_cert.pem self_signed_cert.pem

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

引用:https ://www.rfc-editor.org/rfc/rfc5280

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

于 2019-09-13T17:01:06.450 回答
1

您是否尝试过 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 "

于 2012-04-25T03:26:12.930 回答
0

Java无法分析PKCS12,因此您必须将其转换为keystore使用 openssl。

这里的密钥库有私钥和 X509 证书(或者您可以选择只存储证书)。然后keystore使用标准 JAVA API 获取颁发者并手动验证颁发者。

于 2015-06-30T02:05:03.937 回答