我正在使用 BC 加密和签署 SMIME 消息以用于 AS2。我们的代码适用于绝对古老的充气城堡版本,bcmail-1.4:125
. 升级到任何更新的东西会导致消息的接收者(不是太古老的 Cyclone 服务器)无法验证消息。(例如,maven 中最早的 v也会导致这种情况。这些是没有 API 更改的版本(例如 1.38)。
由于我们使用 JDK 1.7(和 1.8),我一直在尝试将其更新为更新版本的 BC、java-mail 等。我已经将所有 bouncy castle 升级到bcmail-jdk15on:1.51
和bcprov-jdk15on:1.51
,以及 java 邮件,并遵循包中的示例bcmail
。但是,我仍然收到 Cyclone 的错误提示integrity-check-failed
。
我相当肯定错误与我的签名方式有关。当我禁用签名并仅使用加密时,它会正确处理。此外,我可以正确接收来自远程服务器的签名响应并验证签名,这就是我获取错误消息的方式(来自 MimeMultiPart 上的内容处置)。
- 证书由 openssl/self signed/etc 创建,存储在 pkcs12 文件中
- 无限强度政策到位
senderKey
是一个BCRSAPrivateCrtKey
senderCert
org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject
失败:当前代码是这个,使用bcmail-jdk15on:1.51
& 等
SMIMESignedGenerator gen = new SMIMESignedGenerator();
gen.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder()
.setProvider("BC")
.build("SHA1withRSA", senderKey, senderCert));
// gen.addCertificates(new JcaCertStore(list(senderCert))); old v. doesn't add certs
MimeMultipart smime = gen.generate(part); // MimeBodyPart passed in to function
MimeBodyPart tmpBody = new MimeBodyPart();
tmpBody.setContent(signedData);
tmpBody.setHeader("Content-Type", signedData.getContentType()
以前的工作代码看起来像这样并使用bcmail-1.4:1.25
. 解密时升级到 1.3x 也会导致另一端失败(无论我在哪个 jdk 上运行,1.6 - 1.8)
MimeBodyPart body = new MimeBodyPart();
body.setDataHandler(new DataHandler(new ByteArrayDataSource(bytes[], contentType, null);));
SMIMESignedGenerator sGen = new SMIMESignedGenerator();
// SHA1 resolves to "1.3.14.3.2.26", FWIW
sGen.addSigner(senderKey, senderCert, getBouncyCastleAlgorithmId("SHA1"));
MimeMultipart signedData = sGen.generate(part, "BC");
// this is then encrypted & streamed, no issues there
通用设置代码
byte[] data = Files.readAllBytes(filePath);
MimeBodyPart part = new MimeBodyPart();
ByteArrayDataSource dataSource = new ByteArrayDataSource(data, "application/EDIFACT", null);
part.setDataHandler(new DataHandler(dataSource));
part.setHeader("Content-Transfer-Encoding", "8bit");
part.setHeader("Content-Type", "application/EDIFACT");
我感觉这与我添加(或操作)senderCert
本地应用程序的 X509 的方式有关。
更新
我通过删除证书使新代码更符合旧代码:
- 它不再在签名消息中包含证书。老版本没有
- 整个 mime 多部分内容现在的长度(1095 字节)与以前完全相同
- 格式(标题等)现在完全相同
- 签名部分现在几乎相同。但是,有一部分似乎会根据时间(???)而变化,并且每次都会发生变化。我还无法让 openssl 验证此消息,不知道为什么。
这是示例输出,FWIW。中的文本[]
是唯一更改的部分。
------=_Part_1_1448572667.1409621469842
Content-Type: application/EDIFACT
Content-Transfer-Encoding: 8bit
this is a test
------=_Part_1_1448572667.1409621469842
Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature
MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAMYIBpDCCAaAC
AQEwgZ4wgZAxCzAJBgNVBAYTAmNuMREwDwYDVQQIDAhzaGFuZ2hhaTESMBAGA1UEBwwJY2hhbmdu
aW5nMREwDwYDVQQKDAhwb3dlcmUyZTEOMAwGA1UECwwFaXRkZXYxEjAQBgNVBAMMCWFiLWNsaWVu
dDEjMCEGCSqGSIb3DQEJARYUYWItY2xpZW50QG15Q29ycC5jb20CCQClDAGwq37A/jAJBgUrDgMC
GgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwOTAyMDEz
M[TA5]WjAjBgkqhkiG9w0BCQQxFgQUG6KkoqPBvE7Kd9dB0eop/aUTya0wDQYJKoZIhvcNAQEBBQAE
gYB[h9N4maow9aoTQ8QBGgXEYE+xgXSmRPy+ufIsMpuS0Yys/1t3AfXSSI7WKgLMRKYXve8gdb4Gn
dqecHzkBwBq4hebt9YK+E30E6DpZpCwErsgDVaU/ExBA5gauPWneysy+s2bE5Y6pNZ7Qf3kGU5kI
UjlOF/LUNkCsgT5z//]5N6QAAAAAAAA==
------=_Part_1_1448572667.1409621469842--