Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中读取OpenSSL生成的、PEM/DER格式的S/MIME消息_Java_Openssl_Bouncycastle_Smime - Fatal编程技术网

在Java中读取OpenSSL生成的、PEM/DER格式的S/MIME消息

在Java中读取OpenSSL生成的、PEM/DER格式的S/MIME消息,java,openssl,bouncycastle,smime,Java,Openssl,Bouncycastle,Smime,我需要能够在Java中读取从OpenSSL生成的S/MIME文件。openssl命令看起来像 openssl smime -encrypt -in test_message.txt -out test_out.pem -outform pem certificate.pem -----BEGIN PKCS7----- MIIBkwYJKoZIhvcNAQcDoIIBhDCCAYACAQAxggE+MIIBOgIBADAiMBoxGDAWBgNV BAMTD0ZvcmRTRE5TZWN1cml0

我需要能够在Java中读取从OpenSSL生成的S/MIME文件。openssl命令看起来像

openssl smime -encrypt -in test_message.txt -out test_out.pem -outform pem certificate.pem
-----BEGIN PKCS7-----
MIIBkwYJKoZIhvcNAQcDoIIBhDCCAYACAQAxggE+MIIBOgIBADAiMBoxGDAWBgNV
BAMTD0ZvcmRTRE5TZWN1cml0eQIEUw5nyTANBgkqhkiG9w0BAQEFAASCAQBK9wAV
wAXRM7oMWJz113VX7Tb/MslQatHZH2oaX5XJnIJrvnTv9T3irQR9H+pegh1q6OZv
v4Mz/QBFO2iq4tv6xGHE8hl0ZdmNCUdTN41qutZP2+N1YrKi9QLmnuAi3BkEzzeW
YTGvE8xGsjNlTLOjz7P5lZdCWpGJmdPeUDP0IYsOsuMspPcujyOdA5y++y6x90WF
J3ovzPhCRU7303EhdQ1hHse8KTen56XZflL3zhnT2KGtN/Pq3aZ1MVhmLZ+EZuUF
ygxlwCXi3FUx7P35XZAGpTUPFM2sz5p+oSrcxA+fsUgiMb96tfaXZLYE753mA2tZ
WfCRd86nzJsVE/YhMDkGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIAoAQIqd23
FXgqdaSAEHLeYH0LG9G+UfCBxQOalIE=
-----END PKCS7-----
这将创建一个如下所示的文件

openssl smime -encrypt -in test_message.txt -out test_out.pem -outform pem certificate.pem
-----BEGIN PKCS7-----
MIIBkwYJKoZIhvcNAQcDoIIBhDCCAYACAQAxggE+MIIBOgIBADAiMBoxGDAWBgNV
BAMTD0ZvcmRTRE5TZWN1cml0eQIEUw5nyTANBgkqhkiG9w0BAQEFAASCAQBK9wAV
wAXRM7oMWJz113VX7Tb/MslQatHZH2oaX5XJnIJrvnTv9T3irQR9H+pegh1q6OZv
v4Mz/QBFO2iq4tv6xGHE8hl0ZdmNCUdTN41qutZP2+N1YrKi9QLmnuAi3BkEzzeW
YTGvE8xGsjNlTLOjz7P5lZdCWpGJmdPeUDP0IYsOsuMspPcujyOdA5y++y6x90WF
J3ovzPhCRU7303EhdQ1hHse8KTen56XZflL3zhnT2KGtN/Pq3aZ1MVhmLZ+EZuUF
ygxlwCXi3FUx7P35XZAGpTUPFM2sz5p+oSrcxA+fsUgiMb96tfaXZLYE753mA2tZ
WfCRd86nzJsVE/YhMDkGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAOAgIAoAQIqd23
FXgqdaSAEHLeYH0LG9G+UfCBxQOalIE=
-----END PKCS7-----
我目前正在使用BouncyCastle尝试读取test_out.pem

....
MimeMessage mimeMessage = new MimeMessage(session, new FileInputStream("test_out.pem"));
SMIMEEnveloped smimeEnveloped = new SMIMEEnveloped(mimeMessage);
...
但是我不知道如何让它接受没有MIME头的消息,因为我得到了以下错误:

java.lang.NullPointerException: null
    at org.bouncycastle.cms.CMSEnvelopedData.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
    at org.bouncycastle.cms.CMSEnvelopedData.<init>(Unknown Source) ~[bcpkix-jdk15on-1.50.jar:1.50.0]
    at org.bouncycastle.mail.smime.SMIMEEnveloped.<init>(Unknown Source) ~[bcmail-jdk15on-1.50.jar:1.50.0]
java.lang.NullPointerException:null
在org.bouncycastle.cms.cmsendevelopeddata.(未知来源)~[bcpkix-jdk15on-1.50.jar:1.50.0]
在org.bouncycastle.cms.cmsendevelopeddata.(未知来源)~[bcpkix-jdk15on-1.50.jar:1.50.0]
在org.bouncycastle.mail.smime.SMIMEEnveloped.(未知来源)~[bcmail-jdk15on-1.50.jar:1.50.0]

在中读取这样的PEM(或DER)格式文件并能够使用java.security.PrivateKey对其进行解密的最佳方法是什么?

以下是使用BouncyCastle 1.57进行解密的方法(受以下启发):

导入org.bouncycastle.cms.cmsendevelopedData;
导入org.bouncycastle.cms.CMSException;
导入org.bouncycastle.cms.KeyTransRecipientInformation;
导入org.bouncycastle.cms.RecipientInformation;
导入org.bouncycastle.cms.jcajce.jcekeytranvelopedRecipient;
导入org.bouncycastle.cms.jcajce.jcekeytrans收件人;
导入org.bouncycastle.util.encoders.Base64;
导入java.security.KeyFactory;
导入java.security.NoSuchAlgorithmException;
导入java.security.PrivateKey;
导入java.security.spec.InvalidKeySpecException;
导入java.security.spec.PKCS8EncodedKeySpec;
导入java.util.Collection;
公共类PKCS7解密程序{
私钥私钥;
公共PKCS7解密程序(字符串privateKeyStr){
试一试{
字节[]privateKeyData=extractRawData(privateKeyStr,“私钥”);
PKCS8EncodedKeySpec kspec=新的PKCS8EncodedKeySpec(privateKeyData);
KeyFactory kf=KeyFactory.getInstance(“RSA”);
privateKey=kf.generatePrivate(kspec);
}捕获(NoSuchAlgorithmException | InvalidKeySpece异常){
抛出新的RuntimeException(“无法解析私钥”);
}
}
公共字符串解密(字符串加密文本)引发CMSExException{
字节[]数据=extractRawData(encryptedText,“PKCS7”);
CMSEnDevelopedData envelopedData=新的CMSEnDevelopedData(数据);
集合收件人=envelopedData.getRecipientInfos().getRecipients();
KeyTransRecipientInformation recipientInfo=(KeyTransRecipientInformation)recipients.iterator().next();
JceKeyTransRecipient=新的JCEKEYTransInvolopedRecipient(私钥);
返回新字符串(recipientInfo.getContent(收件人));
}
专用字节[]extractRawData(字符串文本,字符串数据类型){
返回Base64.decode(文本
.replace(String.format(“----开始%s-----”,数据类型),”)
.replace(String.format(“----END%s-----”,数据类型),”);
}
}
一些解释:

  • 在类构造函数中,私钥被转换为正确的格式
  • 删除页眉和页脚(如“----BEGIN PKCS7-----”),并对内容进行base64解码

您可以在剥离页眉和页脚行后对数据进行base64解码。通过这种方式可以得到二进制PKCS#7,然后可以对其进行处理。@EugeneMayevski'EldoSCorp True,但我还没有找到处理原始PKCS#7二进制数据的方法。BouncyCastle能够做到这一点,还是我需要一个不同的库?不知道BouncyCastle。我们的安全黑盒做得很好。