我目前正在尝试仅使用证书数据和从外部软件生成的签名数据生成CMSSignedData
(因此我无权访问私钥,签名生成是透明的为了我)。我需要的是将编码数据添加到SMIME
签名内容。
在网络上搜索我找到了BouncyCastle
的解决方案,该解决方案使用私钥和要签名的数据来获取CMSSignedData
。但它不能解决我的问题,因为我无法访问私钥,并且已经生成了签名。
有没有办法只使用证书数据,公钥和以前生成的签名来创建CMS对象?
我可以使用或试用的任何方法或库?
答案 0 :(得分:0)
CMS(加密消息语法)在RFC 5652中指定。 SignedData类型是ASN.1结构,它基本上由签名数据( encapContentInfo ),签名证书(和链)和签名本身( signerInfos 的一部分)组成。 ):
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
因此,您现在要做的是从您拥有的数据中创建此ASN.1结构。如果您还不知道用于签名的算法,您当然可以从外部签名软件的操作员那里获取该信息。
Bouncy Castle通常是ASN.1编码的不错选择,此外,您还可以使用通常创建CMSSignedData
对象(CMSSignedDataGenerator)作为模板的Bouncy Castle的源代码。