【发布时间】:2016-04-15 21:25:00
【问题描述】:
我需要对文件进行签名,到目前为止,我使用的 openssl 运行良好(文件已签名并验证)。
openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer myCrtFile.crt -inkey myKeyFile.key -certfile bundleCertificate.crt -outform der -nodetach
但现在我需要在运行时执行此操作,因此我需要以编程方式对文件进行签名。我正在使用BouncyCastle,但我愿意切换到另一个库。
我不擅长证书,更不擅长BouncyCastle。这是我带来的。
openssl命令到下面代码对应的文件是:
myCrtFile.crt -> signerCertHolder
myKeyFile.key -> privateKeyInfo
bundleCertificate.crt -> certificateHolder
public byte[] sign(String message) throws IOException, CMSException, OperatorCreationException, CertificateEncodingException, MessagingException, CertificateException {
Security.addProvider(new BouncyCastleProvider());
PrivateKeyInfo privateKeyInfo = loadInKey();
X509CertificateHolder signerCertHolder = loadSigner();
X509CertificateHolder certificateCertHolder = loadCertfile();
PrivateKey inKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);
JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter();
X509Certificate signer = certificateConverter.getCertificate(signerCertHolder);
X509Certificate certificate = certificateConverter.getCertificate(certificateCertHolder);
List<X509Certificate> certificateList = new ArrayList();
certificateList.add(signer);
certificateList.add(certificate);
Store<?> certs = new JcaCertStore(certificateList);
ContentSigner sha1signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(inKey);
JcaSignerInfoGeneratorBuilder jcaSignerInfoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build());
CMSSignedDataGenerator signGen = new CMSSignedDataGenerator();
signGen.addSignerInfoGenerator(jcaSignerInfoGeneratorBuilder.build(sha1signer, certificate));
signGen.addCertificates(certs);
CMSTypedData content = new CMSProcessableByteArray(message.getBytes());
CMSSignedData signedData = signGen.generate(content, false);
byte[] signeddata = signedData.getEncoded();
return signeddata;
}
然后我将byte[] 保存到一个文件中。当我打开文件(它是一个 MDM mobileConfig 文件)时,它显示“文件已签名但无法验证”。我觉得我接近解决方案,但我不知道我做错了什么。
有人可以帮我弄清楚我缺少什么来验证文件吗?
PS;证书来自 SSL 证书 (GoDaddy),bundleCertificate.crt 是 GoDaddy 捆绑证书。
【问题讨论】:
标签: java ssl openssl bouncycastle sign