首先,您似乎使用了最新版本的Bouncy Castle中不推荐使用的构造.要添加经过身份验证/签名的

attributes,您必须将它们打包成

AttributeTable签名属性添加到签名者,如下所示:

ASN1EncodableVector signedAttributes = new ASN1EncodableVector();

signedAttributes.add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier("1.2.840.113549.1.7.1"))));

signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(digestBytes))));

signedAttributes.add(new Attribute(CMSAttributes.signingTime, new DERSet(new DERUTCTime(signingDate))));

AttributeTable signedAttributesTable = new AttributeTable(signedAttributes);

然后在其中一个addSigner方法中使用它.正如我在开始时提到的,这种方法已被弃用,我们鼓励您使用Generators和Generator Builders.这是一个简短的例子:

/* Construct signed attributes */

ASN1EncodableVector signedAttributes = new ASN1EncodableVector();

signedAttributes.add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier("1.2.840.113549.1.7.1"))));

signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(digestBytes))));

signedAttributes.add(new Attribute(CMSAttributes.signingTime, new DERSet(new DERUTCTime(signingDate))));

AttributeTable signedAttributesTable = new AttributeTable(signedAttributes);

signedAttributesTable.toASN1EncodableVector();

DefaultSignedAttributeTableGenerator signedAttributeGenerator = new DefaultSignedAttributeTableGenerator(signedAttributesTable);

/* Build the SignerInfo generator builder, that will build the generator... that will generate the SignerInformation... */

SignerInfoGeneratorBuilder signerInfoBuilder = new SignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build());

signerInfoBuilder.setSignedAttributeGenerator(signedAttributeGenerator);

CMSSignedDataGenerator generator = new CMSSignedDataGenerator();

JcaContentSignerBuilder contentSigner = new JcaContentSignerBuilder("SHA1withRSA");

contentSigner.setProvider("BC");

generator.addSignerInfoGenerator(signerInfoBuilder.build(contentSigner.build(this.signingKey), new X509CertificateHolder(this.signingCert.getEncoded())));

ArrayList signingChainHolder = new ArrayList();

Iterator i = this.signingChain.iterator();

while (i.hasNext()) {

X509CertificateObject cert = (X509CertificateObject)i.next();

signingChainHolder.add(new X509CertificateHolder(cert.getEncoded()));

}

generator.addCertificates(new JcaCertStore(signingChainHolder));

generator.generate(new CMSAbsentContent(), "BC").getEncoded();

这是相当笨重,可能还没有工作(我正在编写它,并在研究一些东西时偶然发现你的问题),特别是在签署日期部分,它可能必须是新的DERSet(新的时间(新的日期)) )(更新:它适用于DERUTCTime).

一点offtopic:我仍然无法理解Signed和Authenticated属性之间的区别,Bouncy Castle已经获得了DefaultAuthenticatedAttributeTableGenerator,DefaultSignedAttributeTableGenerator类,它们与Signer完美配合.在签名时,两者之间似乎存在一些细微差别,如果不存在,SignedAttributes会默认添加signedTime. RFC提到了两种属性类型,但我找不到任何确定的东西.

java 属性签名_java – 使用BouncyCastle将签名/身份验证的属性添加到CMS签名相关推荐

  1. jmx客户端_Java JMX客户端示例– JMX身份验证

    jmx客户端 In last tutorial we learned about JMX Basics and how can we use JConsole to manage MBeans. To ...

  2. java 消息摘要_java – 使用BouncyCastle签名消息摘要

    在C#的那一刻,我正在签署这样的挑战: RSACryptoServiceProvider rsa; RSAPKCS1SignatureFormatter RSAFormatter = new RSAP ...

  3. java getclass 相等_java使用反射比较两个bean对象属性值是否相等

    import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import ja ...

  4. java double 赋值语句_Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开 1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明. 其中,long类型最好以 ...

  5. java checkbox数组_Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...

  6. 使用JAVA进行ad域身份验证常用属性详解

    一些变态的公司经常对开发者提出一些变态的问题.比如在oa系统中,要求登录验证必须使用ad域进行登录.还有的如登录crm系统必须使用公司的阿里云邮箱账号进行身份验证等等. 作为程序员我们只能按照客户的需 ...

  7. java md5 密钥_java代码实现MD5加密及验证方法

    MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...

  8. java登录密码验证失败_java – Spring Security:如果身份验证失败,则重定向到登录页面...

    我们有两种登录方式. >用户名和密码由请求标头中的其他应用程序发送.检查IT,如果用户名和密码正确,则进入.[为此编写自定义过滤器] >如果请求标头中不存在用户名和密码,则会显示登录屏幕. ...

  9. java授权失败_自定义Spring Security的身份验证失败处理方法

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...

最新文章

  1. 人群密度估计--Leveraging Unlabeled Data for Crowd Counting by Learning to Rank
  2. java cordova_java – Cordova android后台插件在5分钟后被杀死
  3. servlce与filter的url-pattern介绍
  4. a8处理器相当于骁龙几_天玑820相当于骁龙什么处理器?天梯图秒懂联发科天玑820性能排名...
  5. Python调用C语言
  6. C++学习之路 | PTA乙级—— 1066 图像过滤 (15 分)(精简)
  7. python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...
  8. JAVA中MD5加密实现
  9. C#之重定向输入输出
  10. python进阶学习笔记(四)--多线程thread
  11. 复旦大学计算机学院邱锡鹏,复旦大学邱锡鹏教授为我院师生做学术报告
  12. 华为云域名转入到阿里云的基本流程
  13. java中的耦合_Java中的耦合
  14. 华三交换机配置telnet远程登录和http、https登录
  15. java 8中Comparator.comparing和reversed
  16. 如何解决Win10电脑网速慢的问题?
  17. 鸟哥linux视频教程密码,[鸟哥linux视频教程整理]04_01_Linux用户管理命令详解
  18. C#读取和写入文件(干货分享)
  19. 数据库优化整理之:冷热分离
  20. Linux+MySQL+MyCat实现分库分表,通过MyCat数据库中间件实现分库分表配置实战

热门文章

  1. DNS域名解析流程图(详细)
  2. 群签名和Go语言实现细节(BBS04--Short Group Signatures)
  3. ublox center获取RTK卫星数据
  4. java Map的知识点
  5. 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害
  6. == 和 ===区别
  7. 一行代码生成数据分析报告—Pandas-profiling
  8. 【优化分配】基遗传算法求解医疗资源分配优化问题【含Matlab源码 1419期】
  9. 在Watir中调用JavaScript脚本
  10. 东北人都难懂的东北话