Java 复制';openssl smime';在爪哇有弹跳城堡吗?
我手头有个问题。我不懂Java的同事正在使用OpenSSL命令对文件进行签名,如下所示:Java 复制';openssl smime';在爪哇有弹跳城堡吗?,java,cryptography,bouncycastle,code-signing-certificate,Java,Cryptography,Bouncycastle,Code Signing Certificate,我手头有个问题。我不懂Java的同事正在使用OpenSSL命令对文件进行签名,如下所示: openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \ -inkey passkey.pem -in manifest.json -out signature -outform DER \ -passin pass:12345 正如您所看到的,这里有三个文件被提供给openssl命令来生成签名 现在我
openssl smime -binary -sign -certfile WWDR.pem -signer passcertificate.pem \
-inkey passkey.pem -in manifest.json -out signature -outform DER \
-passin pass:12345
正如您所看到的,这里有三个文件被提供给openssl命令来生成签名
现在我们希望使用Java复制相同的功能,因为我们假设要签名的内容是动态的,本质上是服务器端的。我读到BouncyCastle是一个不错的选择。但我不知道如何使用这个图书馆。我对加密技术也不是很熟悉。我无法理解如何使用上述三个文件对manifest.json
中的内容进行签名
如果有人能指导我找到正确的代码或给我一个开始,我将非常感谢您的努力。首先,不要为努力理解BouncyCastle而感到难过。这是一个非常有用的API,但它的文档很少。最好的办法是四处搜索可以教您如何使用API的示例 由于我以前没有在SMIME中使用过BouncyCastle(我主要用于PGP和/或JCE),因此对“
BouncyCastle SMIME示例
”的简短搜索让我明白了这一点
希望这是一个良好的开端,通过进一步的谷歌搜索将有助于了解正在使用的API类。我怀疑,仅举一个例子就能让你达到80%的目标
如果对输入文件的用途有任何混淆:
-certfile WWDR.pem
-这是要在消息中指定的附加证书。签名消息的接收方在验证签名时将考虑此证书。
-signer passcertificate.pem
-这是与您的签名密钥直接对应的证书
-inkey passkey.pem
-这是您的签名密钥因此,如果有人想知道我是如何解决上述问题的,以下是我所做的:
我使用了Java的运行时对象
String openSSLCommand = openssl smime -binary
-sign -certfile WWDR.pem -signer passcertificate.pem
-inkey passkey.pem -in manifest.json -out signature -outform DER
-passin pass:12345
Process process = Runtime.getRuntime().exec(openSSLCommand);
谢谢大家我还必须用java复制openssl命令,我就是这样完成的。不需要使用运行时
public byte[] signMobileConfig(byte[] mobileconfig)
throws CertificateEncodingException, PEMException, FileNotFoundException, IOException, CertificateException, OperatorCreationException, CMSException {
Security.addProvider(new BouncyCastleProvider());
X509CertificateHolder caCertificate = loadCertfile();
JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter();
X509Certificate serverCertificate = certificateConverter.getCertificate(loadSigner());
PrivateKeyInfo privateKeyInfo = loadInKey();
PrivateKey inKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);
ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(inKey);
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
JcaDigestCalculatorProviderBuilder digestProviderBuilder = new JcaDigestCalculatorProviderBuilder().setProvider("BC");
JcaSignerInfoGeneratorBuilder generatotBuilder = new JcaSignerInfoGeneratorBuilder(digestProviderBuilder.build());
generator.addSignerInfoGenerator(generatotBuilder.build(sha1Signer, serverCertificate));
generator.addCertificate(new X509CertificateHolder(serverCertificate.getEncoded()));
generator.addCertificate(new X509CertificateHolder(caCertificate.getEncoded()));
CMSProcessableByteArray bytes = new CMSProcessableByteArray(mobileconfig);
CMSSignedData signedData = generator.generate(bytes, true);
return signedData.getEncoded();
}
下面是我加载文件的方式:
public X509CertificateHolder loadSigner() throws FileNotFoundException, IOException {
InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt");
PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
return (X509CertificateHolder) parser.readObject();
}
public PrivateKeyInfo loadInKey() throws FileNotFoundException, IOException {
InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.key");
PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
return (PrivateKeyInfo) parser.readObject();
}
public X509CertificateHolder loadCertfile() throws FileNotFoundException, IOException {
InputStream inputStream = externalResourcesFacade.getResourceAsStream("path/to/.crt");
PEMParser parser = new PEMParser(new InputStreamReader(inputStream));
return (X509CertificateHolder) parser.readObject();
}
这是我的文件映射:
myCrtFile.crt -> signerCertHolder
myKeyFile.key -> privateKeyInfo
bundleCertificate.crt -> certificateHolder
这个问题太宽泛了,拉杰。如果你在互联网上找不到它,那么任何人都不可能想出一个完整的例子。将此标记为答案。