如何从签名的jar文件中创建或提取证书



我正在从jar文件中提取元数据。其中一个元数据组件是证书。我有一个带有*的签名jar文件。DSA和*。SC文件生成。是否有一种方法,以编程方式从这些文件在java中创建证书文件?

一个签名的jar应该有(对于每个签名,如果有多个)

  • signer.SF(不是.SC)条目,与清单一样,具有一些全局属性以及签名覆盖的每个jar条目(类,资源等)的摘要和

  • 一个signer.{RSA,DSA,EC}条目,它是PKCS7(又名CMS)"分离"的签名。这样的PKCS7/CMS签名可以并且通常(至少从jarsigner)确实包含签名者的证书-或者更确切地说组成该链的证书,因为证书链通常是有序的(当然它们在Java密钥库中),但PKCS7/CMS SignedData中的证书在ASN.1中定义为不保持顺序的SET。

'Plain' Java不公开处理PKCS7的类(尽管它们在内部存在),但是如果您可以使用(添加)来自https://www.bouncycastle.org的bcprov,它可以这样做,并且您可以使用这样的代码将证书编写为DER或PEM文件:

import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;
...
byte[] sig = // contents of the signer.RSA/DSA/EC entry e.g. using ZipFile
int n = 0; boolean DER = // true or false as desired
for( X509CertificateHolder cert : new CMSSignedData(sig).getCertificates().getMatches(null) ){
byte[] der = cert.getEncoded(); String filename = "cert"+(++n);
if( DER ) Files.write(Paths.get(filename), der);
else try( PemWriter w = new PemWriter(new FileWriter(filename)) ){
w.writeObject( new PemObject("CERTIFICATE",der) );
}
}

当然,除了写文件,你还可以在循环中做其他存储或处理。

最新更新