3

我正在尝试使用 PackageDigitalSignatureManager 类在签名行提供程序上以编程方式签署办公文档(Word\Excel),但我得到了一个不受支持的哈希算法异常:

一般异常:System.InvalidOperationException:指定了不支持的哈希算法。   
在 MS.Internal.IO.Packaging.XmlDigitalSignatureProcessor.Sign(IEnumerable`1 部分,IEnumerable`1 关系选择器,X509Certificate2 签名者,字符串 signatureId,布尔 embedCertificate,IEnumerable`1 signatureObjects,IEnumerable`1 objectReferences)    
在 System.IO.Packaging.PackageDigitalSignatureManager.Sign(IEnumerable`1 部分,X509Certificate 证书,IEnumerable`1 关系选择器,字符串 signatureId,IEnumerable`1 signatureObjects,IEnumerable`1 objectReferences)

这是我的代码的一部分:

string SigInfoHashAlg = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
string HashAlg = "http://www.w3.org/2001/04/xmlenc#sha256";

PackageDigitalSignatureManager dsm = new PackageDigitalSignatureManager(package);
dsm.CertificateOption = CertificateEmbeddingOption.InSignaturePart;
dsm.HashAlgorithm = SigInfoHashAlg;
System.Collections.Generic.List<Uri> toSign = new System.Collections.Generic.List<Uri>();
System.Collections.Generic.List<PackageRelationshipSelector> relationshipSelectors = new System.Collections.Generic.List<PackageRelationshipSelector>();
foreach (PackageRelationship relationship in package.GetRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"))
{
  AddSignableItems(relationship, toSign, relationshipSelectors);
}

X509Certificate cert = new X509Certificate(Cert);
System.Collections.Generic.List<System.Security.Cryptography.Xml.DataObject> signatureObjects = new System.Collections.Generic.List<System.Security.Cryptography.Xml.DataObject>();
System.Collections.Generic.List<Reference> objectReferences = new System.Collections.Generic.List<Reference>();
Reference officeItemRef = new Reference(_OfficeUri);
officeItemRef.Type = "http://www.w3.org/2000/09/xmldsig#Object";
try{
    NewSig = dsm.Sign(toSign, cert, relationshipSelectors, "idPackageSignature", signatureObjects, objectReferences);
}
catch (CryptographicException ex)
{
    throw ex;
}

我已经使用 PackageDigitalSignatureManager 类搜索并找到了很多页面,但没有一个提供有关此过程的工作示例或解释。

正如我从研究中了解到的,dsm.HashAlgorithm 应该是影响签名算法的参数(即使在 .Net 框架 XmlDigitalSignatureProcessor 的源代码中也能看到)。

我知道有人会认为 SignatureDescription 类将是一个解决方案,但我也尝试过。

  1. 我已将 machine.config 配置为使用我的相关哈希 ID
  2. SHA1 工作正常,直到现在 SHA1 都是硬编码的。如果您需要任何其他信息,欢迎您提出要求。
  3. 请注意,我说的是 Net Framework 3.0,因此 4.0 解决方案不相关,除非您会说没有其他选择(不得已)。

非常感谢,亚历克斯。

4

0 回答 0