Java 在PDF中启用LTV签名

Java 在PDF中启用LTV签名,java,pdf,digital-signature,bouncycastle,pkcs#7,Java,Pdf,Digital Signature,Bouncycastle,Pkcs#7,据我所知,有两种方法可以做到这一点 添加DSS字典 在签名时在签名中嵌入CRL或OCSP响应 DSS方式似乎可行,Adobe将签名识别为已启用LTV。第二种方法将更适合我们的应用程序,所以我仍然尝试让它工作。我在将OCSP响应添加到签名时遇到问题,因此我只尝试添加证书和CRL。如果我错了,请纠正我,但据我所知,应将CRL或OCSP响应添加到签名中。两者都不需要吗?我收集签名证书及其根证书,以及TSA证书及其根证书。之后,我取所有的CRL。所有这些都是在签名和时间戳之前添加的。仅添加证书和CR

据我所知,有两种方法可以做到这一点

  • 添加DSS字典
  • 在签名时在签名中嵌入CRL或OCSP响应
DSS方式似乎可行,Adobe将签名识别为已启用LTV。第二种方法将更适合我们的应用程序,所以我仍然尝试让它工作。我在将OCSP响应添加到签名时遇到问题,因此我只尝试添加证书和CRL。如果我错了,请纠正我,但据我所知,应将CRL或OCSP响应添加到签名中。两者都不需要吗?我收集签名证书及其根证书,以及TSA证书及其根证书。之后,我取所有的CRL。所有这些都是在签名和时间戳之前添加的。仅添加证书和CRL似乎不起作用,因为Adobe无法将签名识别为已启用LTV。我真的不明白我做错了什么,所以非常感谢任何帮助

Store crlStore = new JcaCRLStore(crls); 
gen.addCRLs(crlStore);

Store certStore = new JcaCertStore(certList); 
gen.addCertificates(certStore);

错误之处在于将CRL放入通常用于CRL的CMS签名容器元素中。但是,在集成PDF签名的情况下,情况就不同了;这里,CRL应该在一个特殊的有符号属性中

查看ISO 32000-1,其中已指定此属性:

PKCS#7对象应包含以下内容:

  • 作为签名属性的吊销信息(PDF 1.6):此属性可能包括对签名者证书及其颁发者证书执行吊销检查所需的所有吊销信息。由于撤销信息是签名属性,因此必须在计算数字签名之前获得撤销信息。这意味着签名者使用的软件必须能够构造证书路径和相关的撤销信息。如果无法获得其中一个元素(例如,无法连接),则无法使用此属性的签名

12.8.3.3.2撤销信息 adbe吊销信息属性:

adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
                              { adbe(1.2.840.113583) acrobat(1) security(1) 8 }
吊销信息属性的值可以包括以下任何数据类型:

  • RFC 3280(参见参考书目)中描述的证书撤销列表(CRL):CRL通常较大,因此不应嵌入PKCS#7对象中
  • 在线证书状态协议(OCSP)响应,如RFC 2560,X.509 Internet公钥基础设施在线证书状态协议-OCSP中所述(参见参考书目):这些响应通常较小且大小恒定,应该是PKCS#7对象中包含的数据类型
  • 自定义撤销信息:本规范未规定该格式,但该格式可以编码为八位字节字符串。应用程序应该能够通过查看关联的对象标识符来确定八位字节字符串中包含的数据类型
adbe的吊销信息属性值具有ASN.1类型RevocationInfo存档:

RevocationInfoArchival ::= SEQUENCE {
  crl [0] EXPLICIT SEQUENCE of CRLs, OPTIONAL
  ocsp [1] EXPLICIT SEQUENCE of OCSP Responses, OPTIONAL
  otherRevInfo [2] EXPLICIT SEQUENCE of OtherRevInfo, OPTIONAL
}
OtherRevInfo ::= SEQUENCE {
  Type OBJECT IDENTIFIER
  Value OCTET STRING
}

错误之处在于将CRL放入通常用于CRL的CMS签名容器元素中。但是,在集成PDF签名的情况下,情况就不同了;这里,CRL应该在一个特殊的有符号属性中

查看ISO 32000-1,其中已指定此属性:

PKCS#7对象应包含以下内容:

  • 作为签名属性的吊销信息(PDF 1.6):此属性可能包括对签名者证书及其颁发者证书执行吊销检查所需的所有吊销信息。由于撤销信息是签名属性,因此必须在计算数字签名之前获得撤销信息。这意味着签名者使用的软件必须能够构造证书路径和相关的撤销信息。如果无法获得其中一个元素(例如,无法连接),则无法使用此属性的签名

12.8.3.3.2撤销信息 adbe吊销信息属性:

adbe-revocationInfoArchival OBJECT IDENTIFIER ::=
                              { adbe(1.2.840.113583) acrobat(1) security(1) 8 }
吊销信息属性的值可以包括以下任何数据类型:

  • RFC 3280(参见参考书目)中描述的证书撤销列表(CRL):CRL通常较大,因此不应嵌入PKCS#7对象中
  • 在线证书状态协议(OCSP)响应,如RFC 2560,X.509 Internet公钥基础设施在线证书状态协议-OCSP中所述(参见参考书目):这些响应通常较小且大小恒定,应该是PKCS#7对象中包含的数据类型
  • 自定义撤销信息:本规范未规定该格式,但该格式可以编码为八位字节字符串。应用程序应该能够通过查看关联的对象标识符来确定八位字节字符串中包含的数据类型
adbe的吊销信息属性值具有ASN.1类型RevocationInfo存档:

RevocationInfoArchival ::= SEQUENCE {
  crl [0] EXPLICIT SEQUENCE of CRLs, OPTIONAL
  ocsp [1] EXPLICIT SEQUENCE of OCSP Responses, OPTIONAL
  otherRevInfo [2] EXPLICIT SEQUENCE of OtherRevInfo, OPTIONAL
}
OtherRevInfo ::= SEQUENCE {
  Type OBJECT IDENTIFIER
  Value OCTET STRING
}

非常感谢。在阅读了一些文献和问题之后,我得出了相同的结论。您特别回答了一个问题。:)我现在正在添加CRL和OCSP响应,Adobe将该签名识别为已启用LTV。收集所有这些信息需要太多时间。“收集所有这些信息需要太多时间。”-好吧,根据您的使用情况,一些缓存可能会有所帮助。如果嵌入CRL,通常可以在相当长的一段时间内重复使用它们,因为它们不会经常被重新发布。OCSP响应的情况稍有不同,它们应该是非常新鲜的,但通常也可以缓存几分钟。另一方面,如果使用相同的证书(或只有少数证书)签名并添加吊销信息