- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 BC 加密和签署用于 AS2 的 SMIME 消息。我们的代码适用于绝对古老的充气城堡版本 bcmail-1.4:125
。升级到更新的版本会导致消息的接收者(不是太古老的 Cyclone 服务器)无法验证消息。 (例如 maven 中最早的 v 也会导致此问题。这些是没有 API 更改的版本(例如 1.38)。
自从我们使用 JDK 1.7(和 1.8)以来,我一直在尝试将它更新到更新版本的 BC、java-mail 等。我已经将所有的充气城堡升级到 bcmail-jdk15on: 1.51
和 bcprov-jdk15on:1.51
,以及 java 邮件,并遵循 bcmail
包中的示例。但是,我仍然收到 Cyclone 的错误消息,提示 integrity-check-failed
。
我相当确定错误出在我的签名方式上。当我禁用签名并仅使用加密时,它会正确处理。此外,我可以正确地从远程服务器接收签名的响应并验证签名,这就是我获取错误消息的方式(从 MimeMultiPart 上的内容配置)。
senderKey
是一个 BCRSAPrivateCrtKey
senderCert
org.bouncycaSTLe.jcajce.provider.asymmetric.x509.X509CertificateObject
失败:当前代码是这样的,使用bcmail-jdk15on:1.51
& etc
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。
更新
我通过删除证书使新代码与旧代码更加一致:
这是示例输出,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--
最佳答案
经过大量的debug、dump文件等,证明了和digest计算有一定关系。在签名正文部分的特定位置是内容 MIC(摘要的 base64)。不知何故,这个值与另一方所做的不匹配......
一旦我知道了,并且在谷歌上又花了一些时间,我终于找到了 more information on sourceforge 来确认这一点。很有帮助,因为它提到了我的特定版本的 BC。引用:
The problem is that BC >= 1.27 will "canonicalize" all messages that are not sent with content-transfer-encoding binary.
What does this mean?
In the S/MIME rfc it says that all messages should be converted to a "canonical" form before computing the MIC. The "canonical" form for text messages is that EOL is indicated by CR, LF. The rfc's are silent on what the canonical form for other content types is. Many S/MIME implementations (e.g. openssl, Bouncy Castle after 1.27) incorrectly assume that the canonical form for all messages except those sent with content-transfer-encoding binary is that every LF should be preceeded by a CR.
So if a BC 1.25 used sends a message including bare LF characters then the MIC validation will fail if the message is received by an application using BC >= 1.27, or openssl smime, or many other S/MIME implementations.
OpenAS2 should be fixed to use content-transfer-encoding binary.
只有在 MIME 正文部分上设置编码时,这才有效。我已经通过执行 JCA 路由验证了相同的结果(在服务器上失败)手动,轻量级路线,还有CMS路线。
根据这些信息,我对发件人做了一个简单的更改....
MimeBodyPart part = //.. make mime body part from file
part.setHeader("Content-Transfer-Encoding", "binary");
有趣的是,改变任何与 SMIMESignedGenerator()
相关的东西似乎都没有效果:
gen = SMIMESignedGenerator("binary"); // nothing, even though the docs say to set this
对于任何感兴趣的人,我的最终签名函数如下所示:
SMIMESignedGenerator gen = new SMIMESignedGenerator();
SignerInfoGenerator sigGen = new JcaSimpleSignerInfoGeneratorBuilder()
.setProvider(BC)
.build("SHA1withRSA", senderKey, senderCert);
gen.addSignerInfoGenerator(sigGen);
MimeMultipart smime = gen.generate(part);
MimeBodyPart tmpBody = new MimeBodyPart();
tmpBody.setContent(smime);
tmpBody.setHeader("Content-Type", smime.getContentType());
return tmpBody;
原始文件只有一行:
this is a test
被签名的输入是这样的:
Content-Type: application/EDIFACT
Content-Transfer-Encoding: binary
this is a test
调试信息:
data bytes:
436F6E74656E742D547970653A206170706C69636174696F6E2F454449464143540D0
A436F6E74656E742D5472616E736665722D456E636F64696E673A2062696E6172790D
0A0D0A74686973206973206120746573740A
digest mic: {
"algorithmId": "1.3.14.3.2.26"
"digest bytes": "CEC2C6614A481DFDF45C801FD6F2A51BC53D3FDF"
"digest base64": "zsLGYUpIHf30XIAf1vKlG8U9P98="
}
Not 这不附加签名,或添加任何功能,并使用 v1 x509 证书。现在一切都恢复正常了,我可能会改变这些东西。
我真的希望所有这一切都更加透明......BC 在内部是间接的间接的,虽然我明白为什么。它在内部仍然比旧版本好。我不能说我没有找到很多示例,但是 BC 测试用例似乎不是最好的(例如,我找不到一个在之后根据预期摘要值进行验证的测试用例SMIME'ing。也许我错过了)
关于java - 使用较新版本的 Bouncy CaSTLe 时,接收方无法验证 SMIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562613/
我正在尝试使用 java 邮件阅读多部分/签名邮件,但是当我阅读 .mime 时,我没有看到原始附件,原始附件被忽略,只有我可以看到 smime.7ps 文件。这是我使用的代码: ByteArrayD
我有一个签名的电子邮件消息作为字符串。我想获取带有附件和正文的完整未签名消息的字符串,我可以使用这些消息进行解析,例如 Mail gem。 我找到了问题:Decode/extract smime.p7
我在 OSX 10.6 上使用 openssl 1.0.1b 的命令行界面。 首先,我创建一个 DSA key 。 openssl dsaparam -noout -out privatekey.pe
我想用JAVA开发一个基于SMIME的应用程序。在某些领域,我需要对 SMIME 加密/解密进行更多说明。我了解在单个收件人的情况下如何对消息进行加密和解密。 如果只有一个收件人 随机生成的 sess
我找不到任何对我有帮助的东西。我在保留 smime 电子邮件的签名时遇到问题。我正在尝试获取加密的 smime 消息,解密它,然后将其保存到数据库(用于工作)。由于消息首先被签名然后被加密,所以我认为
我们的服务正在运行 python,突然我无法验证其他人的 java 签名。 我尝试在 java 中验证,它有效... 它只是突然发生,没有对代码和证书文件做任何更改 和合作伙伴也声称他们没有改变任何东
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 8年前关闭。 Improve this que
我已经在我的系统中生成了一个本地证书,我正在尝试通过 smime 加密一个文件。但是当我运行命令时,它给我错误 Unable to load certificate Expecting trusted
我正在使用 openssl smime 来签署和验证数据。 要使用 openssl 签署文本文件,我使用以下命令: openssl smime -sign -in sample.txt -out ma
我正在尝试在一个较大的项目中编写一个简单的文件加密/解密。由于许可证问题,我想避免使用 libgpgme。 openPGP 标准对于我的项目时间框架来说太复杂了。我想用 openssl 做我的加密工作
您好,我找不到一种方法将不透明的 pkcs#7(p7m) 转换为明文分离的 smime,以便常规 mime 库可以处理签名的内容。 我想获取 p7m 文件并将其转换为保留有效签名的 smime 消息。
问题 1- 我想创建一条 MIME 消息。像这样的事情: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="---1
我想创建具有 S/MIME 格式的 pkcs7 签名信封并且还想阅读它。文件扩展名为 pk7。 如何使用 OpenSSL 库做到这一点? 最佳答案 SMIME_read_PKCS7()和 SMIME_
我正在寻找一种在客户端解密 S/MIME 电子邮件的方法。我特别不希望客户端与服务器共享私钥,因此需要找到一种方法让客户端自行完成所有操作。 我不需要支持多种浏览器,所以使用类似 window.Cry
所以,我有这个应用程序可以创建一个包含图像和内容的 zip 文件 我想使用 smime 对其进行签名。 如果我使用终端命令: openssl smime -binary -sign -passin "
我正在使用 BC 加密和签署用于 AS2 的 SMIME 消息。我们的代码适用于绝对古老的充气城堡版本 bcmail-1.4:125。升级到更新的版本会导致消息的接收者(不是太古老的 Cyclone
我试图做的是在 Mac 上复制通过终端运行的以下命令,但在 iPhone/Cocoa 上: openssl smime -binary -sign -signer cert.pem -inkey ke
我正在尝试使用 java 解码 PEM 编码文件。已经发布了一个非常相似的问题,但是它针对的是 DER 编码文件,而不是 PEM 编码文件。 openssl -decrypt by Java 那里使用
我见过很多可以使用 SMIME 加密和发送电子邮件的示例,但没有加密常规文件的示例。我有一种将 key 插入 bd 的方法,但我不知道如何使用 bouncycaSTLe 的 SMIME 来加密文件。
我将一个苹果关联文件上传到我的服务器,该服务器通过 HTTPS 提供内容,但链接验证器 here给我这个错误 你的文件应该使用 openssl smime -verify -inform DER -n
我是一名优秀的程序员,十分优秀!