Search code examples
javax509certificatebouncycastlepkcs#7

Java BC1.47: Need to extract signer's X509CertificateObject from a CMSSignedData object


I'm trying to extract the signer's X509CertificateObject from a CMSSignedData object using java Bouncy Castle 1.47. So far I have only been able to extract an org.bouncycastle.asn1.x509.Certificate object. How do I get a X509CertificateObject from this? Thanks a lot!

public static X509CertificateObject extractSignersCert(CMSSignedData cmsSignedData)
    throws Exception
{
    SignerInformationStore signerInfoStore;
    SignerInformation signerInfo;
    Store certStore;
    Collection certCollection;
    X509CertificateHolder x509CertHolder;
    X509Certificate cert;
    X509CertificateObject certObj;
    JcaX509CertificateConverter certConverter;

    signerInfoStore = cmsSignedData.getSignerInfos();
    signerInfo = (SignerInformation) signerInfoStore.getSigners().iterator().next();

    certStore = cmsSignedData.getCertificates();
    certCollection = certStore.getMatches(signerInfo.getSID());
    x509CertHolder = (X509CertificateHolder) certCollection.iterator().next();

    certConverter = new JcaX509CertificateConverter();
    certConverter.setProvider("BC");

    cert = certConverter.getCertificate(x509CertHolder);
    certObj = (X509CertificateObject) cert;

    return certObj;
}

Solution

  • Finally found a solution based on this post. The trick is to use a JcaX509CertificateConverter() and feed it with the X509CertificateHolder you can easily get from the CMSSignedData. Works just fine.