1

我想JSCEP与属性证书 (AC) 一起使用,它们是 X.509 的一部分。当我检查 Java 库时。在java.security.cert包中包含一个摘要X509Certificate,但此证书继承了一个getPublicKey方法java.security.cert.Certificate,该方法不是 AC 的一部分。

我的问题:

  • 可以在X509Certificate没有公钥的情况下使用。这样在其他java类中就不会出现问题了JcaX509CertificateConverter吗?
  • 我应该实现一个AttributeCertificate不继承自的自己的类java.security.cert.Certificate吗?
  • 最佳实践方法是什么?
4

1 回答 1

4

该类X509Certificate表示公钥证书(PKC),而属性证书(AC)虽然是类似(但不是那么多)结构,但没有公钥。而且它们不是一回事。

AX509Certificate不能在没有公钥的情况下使用,因为密钥是它的一部分。如果您查看RFC 的定义,您会发现它是一个必填字段:

Certificate  ::=  SEQUENCE  {
    tbsCertificate       TBSCertificate,
    signatureAlgorithm   AlgorithmIdentifier,
    signatureValue       BIT STRING  }

TBSCertificate  ::=  SEQUENCE  {
    ... lots of fields...
    subjectPublicKeyInfo SubjectPublicKeyInfo,
    ... }

SubjectPublicKeyInfo  ::=  SEQUENCE  {
    algorithm            AlgorithmIdentifier,
    subjectPublicKey     BIT STRING  }

公钥也是 PKC 定义的一部分:绑定身份和公钥的东西,如RFC 中所述

...公钥证书,这是将公钥值绑定到主题的数据结构


属性证书此 RFC中定义,它说明了与 PKC 的区别:

有些人经常混淆 PKC 和 AC。一个类比可以使区分变得清晰。PKC 可以被视为像护照一样:它识别持有人,往往会持续很长时间,并且不应该是微不足道的。AC 更像是入境签证:它通常由不同的机构签发,并且不会持续很长时间。由于获得入境签证通常需要出示护照,因此获得签证可能是一个更简单的过程。

在同一页面中,您可以看到AC 的结构与PKC非常不同,因此 AC 的实现不应继承自X509Certificate. 虽然有一些类似的领域,但我认为它们不足以证明继承是合理的(而且它们也有不同的目的和用途,这让我完全放弃了继承)。

在您的情况下最好的方法:我建议使用现有的实现。BouncyCastle 就是其中之一。如果不能使用外部库,可以使用BouncyCastle 的代码作为参考。

于 2017-04-25T18:50:31.163 回答