2017-04-24 144 views
1

我想用JSCEP与属性证书(ACS),他们是X.509的一部分。当我检查Java库时。在java.security.cert封装的抽象X509Certificate包含但此证书继承java.security.cert.Certificate一个getPublicKey方法,该方法不是一个交流的一部分。JSCEP与x509证书和属性证书

我的问题:

  • 请问X509Certificate不公钥使用。那么在JcaX509CertificateConverter等其他java类中不会出现问题?
  • 我应该实现自己的AttributeCertificate类,它不从java.security.cert.Certificate继承?
  • 什么是最佳实践方法?

回答

4

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作为参考。

+0

非常感谢你的这个好的答案。你知道bouncycastle是否实施了一个协议来管理像SCEP这样的AC吗? –

+0

好吧,有一个'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

+0

非常感谢你! –