【问题标题】:BouncyCastle - signature algorithm in TBS cert not same as outer certBouncyCastle - TBS 证书中的签名算法与外部证书不同
【发布时间】:2014-05-19 00:30:26
【问题描述】:

我正在尝试使用 bouncy castle API 验证证书路径和签名。

我得到以下异常。我已验证我的证书和颁发者证书中的签名算法“SHA256WithRSAEncryption”是相同的。

任何帮助将不胜感激。

Exception in thread "main" org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
    at org.bouncycastle.jce.provider.RFC3280CertPathUtilities.processCertA(Unknown Source)
    at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(Unknown Source)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:250)


Caused by: java.security.cert.CertificateException: signature algorithm in TBS cert not same as outer cert
    at org.bouncycastle.jce.provider.X509CertificateObject.checkSignature(Unknown Source)
    at org.bouncycastle.jce.provider.X509CertificateObject.verify(Unknown Source)
    at org.bouncycastle.jce.provider.CertPathValidatorUtilities.verifyX509Certificate(Unknown Source)
    ... 6 more

签名:

public byte[] sign(byte[] data) throws GeneralSecurityException, CMSException, IOException {

          CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
          generator.addSigner(pk, (X509Certificate) cert,
              CMSSignedDataGenerator.DIGEST_SHA1); //Also tried DIGEST_SHA256
          generator.addCertificatesAndCRLs(getCertStore());
          CMSProcessable content = new CMSProcessableByteArray(data);

          CMSSignedData signedData = generator.generate(content, true, "BC");
          return signedData.getEncoded();
        }

验证:

CollectionCertStoreParameters params = new CollectionCertStoreParameters(list);
        CertStore store = CertStore.getInstance("Collection", params, "BC");
        //create certificate path
        CertificateFactory fact = CertificateFactory.getInstance("X.509", "BC");
        List<X509Certificate> certChain = new ArrayList<X509Certificate>();
        //Create the certificate chain
        for( int i = 0; i < list.size(); i++)
            certChain.add(list.get(i));
        //Create the chain of certificates
        CertPath certPath = fact.generateCertPath(certChain);

        Set<TrustAnchor>      trust = Collections.singleton(new TrustAnchor(rootX509cert, null));
        //Get the certificate path validator
        CertPathValidator validator = CertPathValidator.getInstance("PKIX", "BC");
        PKIXParameters param = new PKIXParameters(trust);
        param.setRevocationEnabled(false);
        param.addCertStore(store);
        param.setDate(new Date());
        param.addCertPathChecker(new PathChecker());

        //Validate the certificate path
        validator.validate(certPath, param);

【问题讨论】:

  • 请提供您尝试验证的对象。

标签: certificate digital-signature bouncycastle x509


【解决方案1】:

我不确定这是您的 CMS 结构或证书路径验证的问题。我认为您的其中一个证书是错误的。

例外情况是,在 X509Certificate(我猜是您的签名者证书或其链中)中,Certificate signatureAlgorithm 的值与 TBSCertificate signature 的值不同。

https://www.rfc-editor.org/rfc/rfc5280#section-4.1:

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



TBSCertificate  ::=  SEQUENCE  {
    version         [0]  EXPLICIT Version DEFAULT v1,
    serialNumber         CertificateSerialNumber,
    signature            AlgorithmIdentifier, <--
    issuer               Name,
    ...
   

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2012-09-23
    • 2010-11-05
    • 2015-05-23
    相关资源
    最近更新 更多