PackageDigitalSignatureManager.VerifySignatures()会导致网络外的呼叫吗?

时间:2013-08-23 16:20:06

标签: c# digital-signature system.io.packaging open-packaging-convention

我有业务要求在继续处理文档之前检查Open Packaging Conventions Package(它是Word文档)上的数字签名。在将包交付给客户端之前,我已经签署了该包,因此我的代码需要在运行时验证该文件来自我并且还没有被更改。我有正确执行此操作的代码:

public static bool VerifySignature(Package package)
{
    bool verified = true;

    PackageDigitalSignatureManager dsm = new PackageDigitalSignatureManager(package);
    VerifyResult verifyResult = dsm.VerifySignatures(false);

    verified &= verifyResult == VerifyResult.Success;

    var signature = dsm.Signatures.Where(s => s.Signer.Subject.Equals("MyCompanyName")).FirstOrDefault();

    verified &= !ReferenceEquals(signature, null) && signature.Signer.Issuer.Equals("NameOfCA");

    return verified;
}

我的问题与调用PackageDigitalSignatureManager.VerifySignatures()时实际发生的事情有关。我担心在证书验证期间,将进行CRL检查或网络外的其他呼叫。我有一些客户在完全没有互联网访问权限的机器上运行我的应用程序。如果代码依赖于互联网访问,它对我来说基本上是一个showstopper。

我想知道两件事:

  1. 我的代码是否会导致CRL检查或其他可能导致网络外呼叫的内容?
  2. 如果是这样,有没有办法阻止它,或者使用不同的机制可靠地验证签名?

2 个答案:

答案 0 :(得分:1)

  
    

回复:我想知道两件事 -

         

我的代码是否会导致CRL检查或其他可能导致网络外呼叫的内容?

  

不:MS以其无限的智慧似乎将验证过程分为两部分,PackageDigitalSignatureManager.VerifySignatures和。{ PackageDigitalSignatureManager.VerifyCertificate

在MS文档中,似乎 VerifySignature 方法仅检查签名和哈希的格式,确保自签名后文档未更改。 MS文档在备注部分中说明“此方法仅验证数字签名;它不验证相关的X.509证书。可以使用VerifyCertificate方法验证X.509证书。”

接下来,您(应该)使用 VerifyCertificate 方法在签名时检查签名证书的撤销状态。它包括可能的error code value “OfflineRevocation”

摘要:目前,您的代码未完全验证签名,因为您没有检查签名证书的撤销状态。因此,您的代码只进行本地签名检查。正式来说,这些检查不是完整的验证。

  
    

如果是这样,有没有办法阻止它

  
  1. 请勿验证签名证书(您现在正在做什么)。

  2. 尝试验证签名证书,但如果唯一的问题是由于系统未连接到互联网而无法检查吊销状态,请向用户提供一条好消息。以下是Adobe读者在完全相同的情况下给出的消息:

  3. enter image description here

    仅在系统处于脱机状态时,培训用户他们应该期望“脱机撤销”状态。或者更好的是,您的代码可以检查其互联网状态以及是否处于离线状态,然后改进验证消息。

答案 1 :(得分:0)

  1. 是的,正确验证证书链需要调用OCSP。一些标准(例如XAdES)允许将OCSP响应和CRL嵌入到文档中,形成一个独立的包,但是在OPC标准中没有明确定义(虽然提到)XAdES的使用,因此不清楚各种软件将如何处理XAdES文档中的数据(即它将使用它还是忽略它或将其视为错误数据)。

  2. 必须执行OCSP检查以确保验证的完整性。如果您使用其他验证机制(例如我们的SecureBlackbox产品支持Office文档签名和加密),您(技术上)可以跳过此步骤,但是如果省略跳过,则安全漏洞的可能性很小。