我正在使用BC加密和签署SMIME消息以与AS2一起使用.我们的代码可以使用绝对古老的充气城堡,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那里得到一个错误,说完整性检查失败了.

我相当肯定错误在于我如何签名.当我禁用签名并仅使用加密时,它会正确处理.此外,我可以正确地从远程服务器接收签名的响应并验证签名,这是我如何获取错误消息(来自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--

最佳答案 经过大量的调试和转储文件等等,我证明了它与摘要计算有关.在签名正文部分中的特定位置是内容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.

只有通过手动执行JCA路由,轻量级路由以及CMS路由,在MIME Body Part上设置了我已经验证了相同结果(在服务器上失败)的编码时,这似乎才有效.

有了这些信息,我对发送者做了一个简单的改变….

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="

}

这不会附加签名,或添加任何功能,并使用v1 x509证书.我现在可能会改变这些东西,因为这一切都在重新开始.

我真的希望所有这一切都更加透明……虽然我理解为什么,BC内部间接是间接的.内部仍然比旧版本更好.我不能说我没有找到很多例子,但BC测试案例看起来并不是最好的(例如我找不到一个在SMIME之后根据预期的消化值进行验证.也许我错过了它)

java awv音频播放界面_java – 使用较新版本的Bouncy Castle时,接收器无法验证SMIME相关推荐

  1. java awv音频播放界面_HTML audio 播放Base64音频流

    此前在网上搜罗了很久,我都搜烦了,离成功最近的一次,就差几个字母,但是死活都不行.最后花了很多时间才找到正确的方法 这里有两种方式来播放音频流 ,你可以采用一种适合你的方式. $.get(" ...

  2. java实现音频播放小程序_微信小程序实现音频文件播放进度的实例代码

    问题描述 在微信小程序中经常会用到控制文件播放的滑块,通过滑块可控制音频播放进度,下面即用代码实现. 解决方案 首先用.wxml与 .wmss 代码实现进度条的效果,再通过 .js 文件控制进度条的进 ...

  3. java 音频播放器_JAVA音频播放器问题

    代码如下,请高手帮忙解决importjava.applet.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.n ...

  4. java 错误声音播放器_java 音频播放器出不了声音,代码里哪有问题啊?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java ...

  5. java 手机音频播放,用Java实现音频播放

    桌面PC的性能日益提高,Java虚拟机的优化技术也不断获得突破,这一切使得用Java处理实时信号成为可能.本文将通过设计和构造一个支持实时mp3.WAV和Ogg音频格式解码/回放的Java音乐播放器, ...

  6. java画笔覆盖在界面_Java实现画图程序和重绘

    上次聊了一下事件监听机制,今天就来聊一下怎么实现一个画图程序并且实现重绘. 一.实现画图程序 1.实现一个画图程序所需的API类? JFrame窗体容器组件类 JPanel 面板元素组件类 JButt ...

  7. java图形用户登录界面_Java简单登录图形界面

    一.登录界面 1.程序代码 1 import java.awt.*;//导入awt包 2 import javax.swing.*;//导入swing包 3 import java.awt.event ...

  8. java编写系统登录界面_java 登陆界面怎么写,连接数据库后

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 界面是 package 界面类; import javax.jws.soap.SOAPBinding.Use; import javax.swing.JB ...

  9. java画笔覆盖在界面_Java画笔的简单实用方法

    Java中提供了画笔,可以使用画笔做出界面上的任何东西,接下来先熟悉一下画笔的使用过程,以画一条线为例. 源码: import java.awt.Graphics; import java.awt.e ...

最新文章

  1. maven 多环境打包
  2. Win7下面wubi安装Ubuntu14.04LTS
  3. 32位x86处理器架构
  4. OpenGL着色器将纹理应用于全屏四边形
  5. python读取mysql数据_如何将mysql的数据读取python
  6. Java,Scala,Guava和Trove集合-它们可以容纳多少数据?
  7. java ean13 条形码_【教程】Spire.Barcode 教程:如何在C#中创建EAN-13条码
  8. 生命、生活:同样重要
  9. 生物信息考研C语言,四川大学生物信息学初试经验分享
  10. Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程)
  11. 设计模式学习笔记——单例(Singleton)模式
  12. [LeetCode] Inorder Successor in BST 二叉搜索树中的中序后继节点
  13. 由浅入深,逐步了解 Java 并发编程中的 Synchronized!
  14. 自学python编程免费教程-Python十分钟入门 自学python基础教程送你参考
  15. python调用curl_Python3模拟curl发送post请求操作示例
  16. (转)主成分分析(Principal components analysis)-最大方差解释
  17. 基于Delphi7的木马程序的查杀设计与实现
  18. 使用Arduino+声音模块+LCD显示屏制作分贝仪
  19. 小猫钓鱼纸牌游戏java_纸牌游戏----小猫钓鱼
  20. captain and crew

热门文章

  1. js实现的老黄历项目总结
  2. S参数在SI仿真中的应用-1
  3. STM32F411RE NUCLEO标准库:报错#47;#20
  4. 学生信息录入java,基于java的学生信息管理系统
  5. 不惧恶意攻击,自带活体检测的人脸识别已上线!
  6. #Java学习总结面向对象+抽象+接口
  7. 备考除了PDF编辑,还需要迅读PDF大师哪些神仙功能?
  8. 【SPIE独立出版 | Ei检索 】第二届物联网与机器学习国际学术会议征稿中!
  9. 跑步时戴什么耳机好,性能排名靠前的五款耳机分享
  10. 折腾,折腾!VM7.0 虚拟机安装雪豹Mac OS snow leopard 10.6!