1

在继续处理文档之前,我有一个业务需求来检查 Open Packaging Conventions 包(它是一个 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 检查或网络外部的其他调用。我有一些客户在完全无法访问互联网的机器上运行我的应用程序。如果代码依赖于互联网访问,那么它对我来说基本上是一个障碍。

我想知道两件事:

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

2 回答 2

1

Re: 我想知道两件事——

我的代码会导致 CRL 检查或其他可能导致网络外呼叫的情况吗?

否:MS,以其无限的智慧似乎将验证过程分为两部分,PackageDigitalSignatureManager.VerifySignaturesPackageDigitalSignatureManager.VerifyCertificate

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

接下来,您(应该)使用VerifyCertificate方法在签名时检查签名证书的吊销状态。它包括可能的错误代码值 “OfflineRevocation”

摘要:此时,您的代码没有完全验证签名,因为您没有检查签名证书的吊销状态。因此,您的代码仅进行本地签名检查。从形式上讲,这些检查并不是完整的验证。

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

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

  2. 尝试验证签名证书,但如果唯一的问题是由于系统未连接到互联网而无法检查吊销状态,请给用户一个很好的消息。这是 Adob​​e 阅读器在完全相同的情况下给出的信息:

在此处输入图像描述

培训您的用户,使其仅在系统脱机时才应期待“脱机撤销”状态。或者更好的是,您的代码可以检查其互联网状态,如果它处于离线状态,则改进验证消息。

于 2013-08-25T05:16:34.853 回答
0
  1. 是的,证书链的正确验证需要调用 OCSP。一些标准(例如 XAdES)允许将 OCSP 响应和 CRL 嵌入到文档中,形成一个自包含的包,但是在 OPC 标准中没有明确定义(尽管提到)XAdES 的使用,因此不清楚各种软件将如何处理文档中的 XAdES 数据(即它会使用它还是忽略它或将其视为错误数据)。

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

于 2013-08-23T18:43:07.503 回答