使用 Java 中的 BouncyCastle 從 PKCS7 PEM 格式的證書創建 X509Certificate

埃德蒙·哈姆

我有一個 PEM 格式的 PKCS7 證書鏈。基本上我想使用 BouncyCastle 庫在 Java 中執行以下 openssl 命令。

openssl pkcs7 -in client-certificate_pkcs7.pem -out client-certificate_chain.pem

我正在關注 BouncyCastle ( https://www.bouncycastle.org/fips-java/BCFipsIn100.pdf )提供的這個 pdf ,但找不到任何適合我需要的東西。

我發現 CMSSignedData 用於 BouncyCastle 中與 pkcs7 相關的操作,因此我嘗試使用它,但出現錯誤,我認為這是因為我使用的是原始字符串。

String pkcs7Pem = "-----BEGIN PKCS7-----\nMIIR...WTEA\n-----END PKCS7-----\n";
CMSSignedData data = new CMSSignedData(pkcs7Pem.getBytes());
Store certStore = data.getCertificates();
SignerInformationStore signerInfos = data.getSignerInfos();
Collection<SignerInformation> signers = signerInfos.getSigners();
List<X509Certificate> x509Certificates = new ArrayList<>();
for (SignerInformation signer : signers) {
    Collection<X509CertificateHolder> matches = certStore.getMatches(signer.getSID());
    for (X509CertificateHolder holder : matches) {
        x509Certificates.add(new JcaX509CertificateConverter().setProvider("BC").getCertificate(holder));
    }
}

這是我遇到的錯誤 new CMSSignedData(pkcs7Pem.getBytes());

org.bouncycastle.cms.CMSException: IOException reading content.

我也試過使用PEMParser,但parser.readObject()下面返回空值。

String pkcs7Pem = "-----BEGIN PKCS7-----\nMIIR...WTEA\n-----END PKCS7-----\n";
PEMParser parser = new PEMParser(new StringReader(pkcs7Pem));
parser.readObject();

任何幫助,將不勝感激!

dave_thompson_085

openssl pkcs7 -in client-certificate_pkcs7.pem -out client-certificate_chain.pem

該命令僅將其輸入(如果是 PKCS7 PEM)複製到其輸出而不進行任何更改。這沒什麼用,你也不需要 BouncyCastle 在 Java 中做同樣的事情。我懷疑你的意思是

openssl pkcs7 -print_certs -in (pkcs7) -out (chain)

它將單個證書提取為一系列單獨的 (PEM) 對象。

我發現 CMSSignedData 用於 BouncyCastle 中的 pkcs7 相關操作

只有一些——有很多PKCS7/CMS 格式和操作可以完成,還有很多不同的 BC 類來完成它們。但是用於攜帶證書鏈的 PKCS7/CMS 格式(通常標記為 p7b 或 p7c)是 SignedData 類型,由 BouncyCastleCMSSignedData類實現。

我也嘗試過使用 PEMParser,但下面的 parser.readObject() 返回 null。

它不應該,如果你給它有效的PEM 輸入而不是你發布的損壞版本。對於我來說,如果我給它含有P7B / C證書鏈,我收到了一個有效的PEM PKCS7ContentInfo然後可以如下解碼(我用的文件I / O為了方便,但任何JavaReaderWriter將工作一樣):

static void SO70048115PKCS7Certs (String[] args) throws Exception {
    PEMParser p = new PEMParser(new FileReader(args[0])); 
    CMSSignedData sd = new CMSSignedData( (ContentInfo)p.readObject() );
    p.close();
    JcaPEMWriter w = new JcaPEMWriter(new FileWriter(args[1])); 
    for( X509CertificateHolder ch : sd.getCertificates().getMatches(null) ){
        // optionally put subject,issuer as 'comments' like OpenSSL does
        w.writeObject( new PemObject("CERTIFICATE",ch.getEncoded()) );
    }
    w.close();
}

請注意,按照慣例,p7b/c 不包含任何簽名(在 PKCS7/CMS 術語中,SignerInfo(s)),因此您發布的代碼 - 旨在查找與簽名關聯的證書) -- 不合適且不起作用。您只需要使用證書而不需要任何 SignerInfo(s)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用openssl在C中使用PEM证书验证DER格式的PKCS7

将 PEM 转换为 PKCS7 (Java)

X509Certificate在Java中为byte [],然后在C#中返回X509Certificate

使用BouncyCastle从PEM格式恢复EC私钥

如何使用证书 pkcs7 签署 xml - Java

BouncyCastle-从X509Certificate对象创建商店

将PEM格式的字符串转换为java.security.cert.X509Certificate

使用Java使用BouncyCastle生成X509证书

在没有BouncyCastle的Java中创建X509证书?

如何在不使用Bouncy Castle的情况下从Java的X509Certificate中提取CN?

C和Java中的输出AES / ECB / PKCS7不相同

如何在保留私钥的同时将BouncyCastle X509Certificate转换为.NET Standard X509Certificate2?

无法使用 PyAsn1 Python 从 pkcs7 信封中获取加密密钥

如何从Java的X509Certificate中提取CN?

将 CertStore 转换为 X509Certificate[] 数组 JAVA

如何在Javascript中获取X509Certificate指纹?

在Ruby on Rails中解密PKCS7

从PKCS7中提取分离的PKCS7签名(签名和数据)

如何在CBC模式和PKCS7填充中解码使用AES-256加密的数据?

使用BouncyCastle验证Java中的ECDSA签名时出错

如何将 ObjectHandle 从 Pkcs11Interop 转换为 X509 证书或 Pem 格式?

无法在C#bouncycastle和PHP openssl之间交换AES-256-CBC / PKCS7

从ECC创建X509Certificate2 X509Certificate在C#中引发'System.NotSupportedException'

x509certificate2 到 NET FR 中的 PEM。4.7.2

从.NET Core中的PEM文件创建X509Certificate2

如何在本机Go中将PEM证书链转换为PKCS7?

从x509certificate2对象以pem格式导出公钥

用Java将x509证书写入PEM格式的字符串?

使用WinCrypt或CNG验证签名文件(PKCS7)