使用来自 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:无法导出不可导出的私钥