在JAVA中生成没有私钥的CMSSignedData

时间:2016-10-07 21:18:39

标签: java bouncycastle smime

我目前正在尝试仅使用证书数据和从外部软件生成的签名数据生成CMSSignedData(因此我无权访问私钥,签名生成是透明的为了我)。我需要的是将编码数据添加到SMIME签名内容。

在网络上搜索我找到了BouncyCastle的解决方案,该解决方案使用私钥和要签名的数据来获取CMSSignedData。但它不能解决我的问题,因为我无法访问私钥,并且已经生成了签名。

有没有办法只使用证书数据,公钥和以前生成的签名来创建CMS对象?

我可以使用或试用的任何方法或库?

1 个答案:

答案 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的源代码。