我遇到了一个让我发疯的PKCS #7问题。事情是这样的:
我有一个ASP.NET Web 服务,它向另一个第三方服务器发出请求并接收一个 PKCS #7 签名令牌作为响应(这个令牌来自哪里实际上并不重要)。然后,我的 Web 服务会检查令牌的签名(和有效性)并将随附的数据返回给调用该方法的用户。
为了执行验证,我这样做(签名有令牌):
public static byte[] VerifyAndExtractEnvelopedData(byte[] signature) { if (signature == null) throw new ArgumentNullException("signature"); // Decode the signature SignedCms cms = new SignedCms(); cms.Decode(signature); cms.CheckSignature(false); if (cms.Detached) throw new InvalidOperationException("Cannot extract enveloped content from a detached signature."); return cms.ContentInfo.Content; }
我部署了 Web 服务(IIS 6)。当我尝试运行上述 web 方法时,在签名验证时,我收到错误:
无法将证书链构建到受信任的根颁发机构
为了简化事情,我用完全相同的代码编写了一个小的 Windows 窗体应用程序。我使用应用程序池中的相同用户帐户以交互方式登录到托管 Web 服务的同一台服务器。在那里运行EXE文件,它工作正常,即能够完美地验证签名。IMO,这排除了任何问题,例如缺少 证书颁发机构(CA) 证书等(事实上,我有签名者的 .CER 文件,我在 Windows 中打开它,它告诉我链没问题)。
显然,唯一的区别是,在第一种情况下,我的进程是 Web 服务,而在第二种情况下,我的进程是桌面 EXE 文件。还有什么可能阻止我在第一种情况下执行验证?