CryptographicException"未加载签名密钥"

时间:2017-08-07 18:00:01

标签: c# .net xml signing

我有一些代码尝试使用X509Certificate2证书签署XML文档:

        byte[] bytes = Convert.FromBase64String(_loginDetails.CertificateAsString);

        X509Certificate2 cert = new X509Certificate2(bytes, _loginDetails.CertKey, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
        Reference reference = new Reference("#MsgBody");

        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        SignedXml signedXml = new SignedXml(doc);
        signedXml.AddReference(reference);
        RSACryptoServiceProvider rsaKey = (RSACryptoServiceProvider)cert.PrivateKey;
        signedXml.SigningKey = rsaKey;
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and add to the SOAP Header
        XmlElement xmlDigitalSignature = signedXml.GetXml();
        ...

此代码适用于8台不同的客户机器和我自己的机器,但我们有1位客户收到错误:

  

未加载签名密钥   System.Security.Cryptography.Xml.SignedXml.ComputeSignature

我从客户处获得了证书和密码的副本,并在我的开发人员计算机上正确签名,没有任何错误。

有没有人更深入地了解为什么会失败?证书和密码都是正确的,它只在客户服务器上失败。 我们正在使用.NET 4.5

2 个答案:

答案 0 :(得分:0)

"解决方案"是在机器上以管理员身份运行我们的付款插件。 不理想,因为其余代码是为了在没有管理员权限的情况下运行而构建的,但我还没有找到任何其他解决方案来解决此问题。

答案 1 :(得分:0)

您的证书中没有私钥 因此,请尝试使用您的证书代替客户端证书

证书应具有私钥