SignedCms.CheckSignature检查签名对哪些证书?

时间:2015-02-03 20:45:12

标签: c# x509certificate2 pkcs#7

我有一条已签名的邮件,我想知道此代码检查签名的证书是什么。 SignedCms是否始终在其中具有签名证书(并且它用于验证签名),或者有时证书不在消息内,并且它是从验证机器证书存储中获取的? 基本上我有兴趣确定签署该消息的用户是谁。

以下是进行验证的代码示例(来自msdn:https://msdn.microsoft.com/en-us/library/aedbc064(v=vs.110).aspx

// Create a ContentInfo object from the inner content obtained independently from encodedMessage.
ContentInfo contentInfo = new ContentInfo(innerContent);
// Create a new, detached SignedCms message.
SignedCms signedCms = new SignedCms(contentInfo, true);
// encodedMessage is the encoded message received from  the sender.
signedCms.Decode(encodedMessage);
// Verify the signature without validating the certificate.
signedCms.CheckSignature(true); //<-- Here is the verification

谢谢,对不起我的英语很差。

1 个答案:

答案 0 :(得分:1)

SignedCms由RFC 2315

中定义的ASN.1结构SignedData表示
 SignedData ::= SEQUENCE {
     version Version,
     digestAlgorithms DigestAlgorithmIdentifiers,
     contentInfo ContentInfo,
     certificates
        [0] IMPLICIT ExtendedCertificatesAndCertificates
          OPTIONAL,
     crls
       [1] IMPLICIT CertificateRevocationLists OPTIONAL,
     signerInfos SignerInfos }

RFC 2315

所述的属性certificates
  

是一组PKCS#6扩展证书和X.509证书。它   意图是该集合足以包含来自a的链   公认的&#34; root&#34;或者&#34;顶级认证机构&#34;所有的   签名者在signerInfos字段中。可能有更多的证书   必要的,可能有足够的证书来包含链   来自两个或更多独立的顶级认证机构。   如果需要,证书也可能少于必要的证书   那些验证签名的人有另一种方法   获得必要的证书(例如,来自前一组   证书)。

但它是可选的。

signerInfos被描述为

  

signerInfos是每个签名者信息的集合。集合中可能包含任意数量的元素,包括零。

SignerInfo包含IssuerAndSerialNumber元素,该元素描述用于签署内容的证书。

RFC 2315

中的更多信息

在c#中,您可以使用以下代码获取证书:

signedCms.SignerInfos[0].Certificate