使用来自 etoken c# 的不可导出私钥签署 xml 请求

Posted

技术标签:

【中文标题】使用来自 etoken c# 的不可导出私钥签署 xml 请求【英文标题】:Sign xml request using non exportable private key from etoken c# 【发布时间】:2017-03-06 11:36:59 【问题描述】:

我正在处理数字签名。我们必须生成 xml 请求并使用私钥对请求进行签名。要从不可导出的 etoken 中获取的私钥。我的发现表明,当私钥标记为不可导出时,无法提取私钥。在这种情况下,我如何签署 xml 请求。请帮忙。

【问题讨论】:

究竟有哪些发现?我不是 100% 肯定,但我不认为这是正确的。您确实需要访问 priv 密钥的权限,所以也许以管理员身份运行 VS?您可以使用证书工具检查访问权限。 抱歉耽搁了...我有权访问我的私钥,但不知道如何通过 C# 使用它来签署 xml 请求。 【参考方案1】:

我终于找到了解决方案。花了一段时间,因为要求有点罕见。此链接https://www.codeproject.com/Articles/240655/Using-a-Smart-Card-Certificate-with-NET-Security-i 帮助我获得了解决方案。请参考下面的代码。 SignXml() 方法请参考这个msdn链接https://msdn.microsoft.com/en-us/library/ms229745(v=vs.110).aspx

    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        store.Open(OpenFlags.MaxAllowed);

        // find cert by thumbprint
        var foundCerts = store.Certificates.Find(X509FindType.Thumbprint, "12345", true);

        if (foundCerts.Count == 0)
            return;

        var certForSigning = foundCerts[0];
        store.Close();

        // prepare password
        var pass = new SecureString();
        var passwordstring = "password";

        var chararr = passwordstring.ToCharArray();
        foreach (var i in chararr)
            pass.AppendChar(i);
        // take private key
        var privateKey = certForSigning.PrivateKey as RSACryptoServiceProvider;

        // make new CSP parameters based on parameters from current private key but throw in password
        CspParameters cspParameters = new CspParameters(1,
             privateKey.CspKeyContainerInfo.ProviderName,
             privateKey.CspKeyContainerInfo.KeyContainerName,
             new System.Security.AccessControl.CryptoKeySecurity(),
             pass);
        RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(cspParameters);

        XmlDocument xmlDoc = new XmlDocument();

        // Load an XML file into the XmlDocument object.
        xmlDoc.PreserveWhitespace = true;
        xmlDoc.Load(path);
        // Sign the XML document. 
        SignXml(xmlDoc, rsaCryptoServiceProvider);

【讨论】:

以上是关于使用来自 etoken c# 的不可导出私钥签署 xml 请求的主要内容,如果未能解决你的问题,请参考以下文章

Export-PfxCertificate:无法导出不可导出的私钥

自动代码签名 - 保护私钥

如何使用椭圆曲线私钥和 ECDSA 算法签署证书?

怎么使用RSATool2v14所生成的公钥、私钥和模数写到易语言中

如何用私钥签署字符串

使用 CryptUIWizDigitalSign API 对 appxbundle 进行签名