我有一個 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();
任何幫助,將不勝感激!
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為了方便,但任何JavaReader
和Writer
將工作一樣):
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] 删除。
我来说两句