的X509Certificate
类表示公钥证书(PKC),而一个属性证书(AC),虽然这是一个类似(但不是很多)结构,没有公共密钥。他们不是一回事。
一个X509Certificate
离不开公钥使用,因为关键是它的一部分。如果您在RFC's definition看一看,你会发现这是一个必填字段:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
TBSCertificate ::= SEQUENCE {
... lots of fields...
subjectPublicKeyInfo SubjectPublicKeyInfo,
... }
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
公钥也是PKC的定义的一部分:东西结合的身份和公钥,为stated in the RFC :
...公钥证书,这是结合 公共密钥值的受试者的数据结构
个属性证书在this RFC定义,它告诉从PKC的差异:
有些人不断地混淆PKCS和AC。一个类比可能会使 的区别变得清晰。一个PKC可以被认为是像 护照:它可以标识持有者,往往会持续很长一段时间, ,不应该是微不足道的获得。交流更像是一个条目 签证:它通常由不同机构颁发的,并且不 最后,只要时间。由于获得入境签证通常需要出示护照,因此获得签证可以是更简单的 程序。
在同一个页面上,你可以看到,AC's structure是从PKC很大的不同,所以交流的实现不应该X509Certificate
继承。虽然有一些类似的领域,但我认为它们并不足以证明继承是正确的(并且它们也有不同的目的和用途,这使我完全放弃了继承)。
你的情况最好的方法:我建议使用现有的实现。 BouncyCastle is one of them。如果您不能使用外部库,则可以使用BouncyCastle's code作为参考。
非常感谢你的这个好的答案。你知道bouncycastle是否实施了一个协议来管理像SCEP这样的AC吗? –
好吧,有一个'X509v2AttributeCertificateBuilder'类,我认为你可以使用它(不知道是否有比这更完整的东西)。我找到了一个示例代码[here](https://github.com/bcgit/bc-java/blob/master/misc/src/main/java/org/bouncycastle/jcajce/examples/AttrCertExample.java) – 2017-04-25 19:51:51
非常感谢你! –