在我的应用程序中我正在使用发行者名称的sha256(x509CertImpl.getIssuerDN()。getName())和证书序列号来唯一标识证书,但现在我已经意识到X509Name的其他实现作为当我调用bcX509Name.getName()时,Bouncy Castle库的实现会显示不同的内容,因此这个标识符对我不起作用...我的问题是如何获得X509Name的唯一标识符...也许是ASN.1或者两者的DER编码表示将是相同的。
答案 0 :(得分:2)
从问题中不清楚您使用的是java.security.cert.X509Certificate
,还是某些不使用JCA接口的Bouncy Castle类。
在任何情况下,都应该有一个方法返回一个代表发行者X.500名称的对象。该对象应该有一个方法,该方法将名称的ASN.1编码作为字节数组返回。将此作为密钥的一个组成部分。
如果您使用标准X509Certificate
或Bouncy Castle X509CertificateObject
,请使用类似的内容(如果您不使用其中一个类,请更具体):
X509Certificate x = ...;
byte[] issuer = x.getIssuerX500Principal().getEncoded();
答案 1 :(得分:1)
IssuerDN是一个复杂的结构,不同的库可能有不同的机制将其“序列化”为字符串。所以你可能需要重新思考你的方法。一般来说,可以使用证书本身的哈希值(整体)+序列号比较(使碰撞的可能性几乎为0)。