我在使用受信任的时间戳与Bouncy

Castle创建有效的CMS签名时遇到问题。签名创建工作良好(我想将签名包括到PDF文件中),签名有效。但是,当我在签名的未签名属性表中添加可信时间戳后,签名仍然保持有效,但是Reader会报告

该签名包括嵌入式时间戳,但是无效 。这使我相信,哈希时间戳是不正确的,但是我似乎无法弄清楚问题出在哪里。

签名代码:

Store store = new JcaCertStore(Arrays.asList(certContainer.getChain()));

CMSSignedDataGenerator signedDataGenerator = new CMSSignedDataGenerator();

JcaSignerInfoGeneratorBuilder infoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build());

JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder("SHA1withRSA");

signedDataGenerator.addSignerInfoGenerator(

infoGeneratorBuilder.build(contentSignerBuilder.build(certContainer.getPrivateKey()), (X509Certificate)certContainer.getSignatureCertificate()));

signedDataGenerator.addCertificates(store);

CMSTypedData cmsData = new CMSProcessableByteArray(data);

signedData = signedDataGenerator.generate(cmsData, false);

Collection ss = signedData.getSignerInfos().getSigners();

SignerInformation si = ss.iterator().next(); // get first signer (should be only one)

ASN1EncodableVector timestampVector = new ASN1EncodableVector();

Attribute token = createTSToken(si.getSignature());

timestampVector.add(token);

AttributeTable at = new AttributeTable(timestampVector);

si = SignerInformation.replaceUnsignedAttributes(si, at);

ss.clear();

ss.add(si);

SignerInformationStore newSignerStore = new SignerInformationStore(ss);

CMSSignedData newSignedData = CMSSignedData.replaceSigners(signedData, newSignerStore);

该createTSToken代码:

public Attribute createTSToken(byte[] data) throws NoSuchProviderException, NoSuchAlgorithmException, IOException {

// Generate timestamp

MessageDigest digest = MessageDigest.getInstance("SHA1", "BC");

TimeStampResponse response = timestampData(digest.digest(data));

TimeStampToken timestampToken = response.getTimeStampToken();

// Create timestamp attribute

Attribute a = new Attribute(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, new DERSet(ASN1Primitive.fromByteArray(timestampToken.getEncoded())));

return a;

}

timestampData:

TimeStampRequestGenerator reqgen = new TimeStampRequestGenerator();

TimeStampRequest req = reqgen.generate(TSPAlgorithms.SHA1, data);

byte request[] = req.getEncoded();

URL url = new URL("http://time.certum.pl");

HttpURLConnection con = (HttpURLConnection) url.openConnection();

con.setDoOutput(true);

con.setDoInput(true);

con.setRequestMethod("POST");

con.setRequestProperty("Content-type", "application/timestamp-query");

con.setRequestProperty("Content-length", String.valueOf(request.length));

OutputStream out = con.getOutputStream();

out.write(request);

out.flush();

if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {

throw new IOException("Received HTTP error: " + con.getResponseCode() + " - " + con.getResponseMessage());

}

InputStream in = con.getInputStream();

TimeStampResp resp = TimeStampResp.getInstance(new ASN1InputStream(in).readObject());

response = new TimeStampResponse(resp);

response.validate(req);

if(response.getStatus() != 0) {

System.out.println(response.getStatusString());

return null;

}

return response;

谢谢你的帮助!

示例文件:

java 时间戳验证_Java中带有时间戳的数字签名相关推荐

  1. java 时间戳 对比_Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...

  2. java正则表达式验证_Java中的正则表达式电话号码验证

    java正则表达式验证 Validating a phone number using regular expression is tricky because the phone number ca ...

  3. java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  4. xml 数字签名 破解_JAVA中带有数字签名的XML安全性

    xml 数字签名 破解 介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,并且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用 ...

  5. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  6. java bean 验证_Java Bean验证基础

    java bean 验证 这篇文章总结了一些简单,快速的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作. 记住,Bea ...

  7. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

  8. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  9. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

最新文章

  1. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS
  2. ASP.NET ViewState 初探
  3. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法
  4. STL vector的几种清空容器(删除)办法
  5. 让窗体获得焦点,一定会有您用到的时候
  6. ubuntu mysql 初始化_Ubuntu初始化MySQL碰到的坑
  7. 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
  8. 执行DBMS_METADATA.get_ddl报ORA-39212的解决方法
  9. AutoPostBack
  10. sha1 java 代码_HMAC-SHA1的java源代码实现
  11. Windows系统、下的MySQL、版本升级、实操
  12. 视频教程-学透JavaScript-JavaScript
  13. 数据库基础学习-计划内容 For 小样儿
  14. Spring Boot 大文件上传(断点上传)、服务端分片下载、客户端分片下载(断点下载)
  15. 计算机方向 会议级别
  16. iOS 图片 绘制梯形 背景图屠屏
  17. angular 自定义打包文件名
  18. YuKimCai——Linux(centos操作系统)挂盘记录
  19. 蓝桥杯第12届第三次模拟
  20. 未来科技 从零到一「真格星球 · 前沿科技创业营」探访加速科技

热门文章

  1. 3.1 神经网络概览-深度学习-Stanford吴恩达教授
  2. u-boot分析之内核启动(五)
  3. verilog基础篇RAM IP核的使用
  4. Android 4.0 Notification
  5. 【进程通信】Socket
  6. w ndows8怎么连接网络,(Wndows8.1优化设置全面解析.doc
  7. 【Sql server: T-Sql 技术内幕 系列】之索引篇
  8. laravle 事务
  9. 爱玛士关于爬虫的scrapy框架的心得
  10. 牛B的调试工具:OzCode