我在使用受信任的时间戳与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. mysql分片库分页查询_mysql数据库分页查询优化
  2. 注意html的语言编码charset,HTML编码
  3. ls -l 显示年份
  4. mybatis学习与踩坑记录
  5. 特征检测和特征匹配方法汇总
  6. 【PMP认证考试之个人总结】第 3 章 项目整合管理
  7. linux如何卸载干净mysql
  8. Angular测试机床TestBed
  9. Python+旧衣物捐赠系统 毕业设计-附源码290942
  10. poi HSSFCellStyle HSSFFont 设置加粗,字体,字号等样式
  11. css-对号/叉号(纯css)
  12. Scrapy 爬取今日头条街拍图片
  13. 太可怕啦!AI 一秒还原马赛克,有码变高清
  14. constantlayout布局
  15. 【办公自动化】基于Python开发的PDF批量转换-合并应用程序
  16. 必记的13个不定积分公式(详细推导)
  17. 【STM32F407的DSP教程】第3章 Matlab简易使用之基础操作
  18. 讲讲自己一天入门Python的一些心得
  19. 知道创宇区块链安全实验室|UmbNetwork 攻击事件分析
  20. qmail+vpopmail+mysql安装

热门文章

  1. 单例模式应用场景_三、单例模式详解
  2. 应用化学:顺式丁烯醛与反式丁烯醛的网络
  3. mysql的还原_MySQL 还原
  4. 大牛深入浅出讲解c语言do{...}while(0)功能及用法
  5. 基于排队理论的云计算模型的MATLAB仿真
  6. 【Vue学习第三天】组件的使用
  7. 网络钓鱼大讲堂 Part4 | 网络钓鱼攻击战术
  8. Android -- 再来一发Intent
  9. 售后服务成OA品牌竞争重要因素
  10. RabbitMQ Topic exchange