【发布时间】:2018-04-06 06:30:00
【问题描述】:
我在获取证书并放入 xml 文件时出现问题。我应该使用私钥进行签名吗?我在证书中只看到公钥。我的证书中没有私钥。
byte[] ckaIdd = objectAttributess[0].GetValueAsByteArray();
string ckaLabel = objectAttributess[1].GetValueAsString();
byte[] ckaValue = objectAttributess[2].GetValueAsByteArray();
var _rawData = ckaValue ?? throw new ArgumentNullException(nameof(ckaValue));
var _parsedCertificate = new X509Certificate2(_rawData);
ECertificate cert = new ECertificate(_parsedCertificate.GetRawCertData());
string signatureListString = "";
XmlDocument document = new XmlDocument();
document.Load(@"C:\Users\MyUser\Desktop\myfile.xml");
Esya e = new Esya();
Context context = e.CreateContext();
context.Document = document;
XMLSignature signature = new XMLSignature(context, false);
signature.addKeyInfo(new ECertificate(cert.getEncoded()));
//signature.sign(v); << ! My problem is with this line
var inv = (XmlElement)signature.Document.GetElementsByTagName("Invoice")[0];
signatureListString += inv.OuterXml + "\n";
var elementCount = (XmlElement)document.GetElementsByTagName("ElementCount")[0];
if (elementCount != null)
{
elementCount.InnerText = "1";
}
var element = (XmlElement)document.GetElementsByTagName("ElementList")[0];
if (element != null)
{
element.InnerXml = signatureListString;
}
var xmlPageSettings = document.GetElementsByTagName("Invoice");
foreach (XmlElement xmlElement in xmlPageSettings)
{
xmlElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
}
session.Logout();
return cert;
}
}
我应该如何处理signature.sign(v);?如何在 xml 文件中添加签名?
【问题讨论】:
-
是的,签名需要私钥。
-
但是证书中的私钥似乎是假的。我该怎么办?
-
这取决于您希望如何与您的 HSM 交谈。我看到很多证书克隆正在进行。也许你最初得到的
_rawData有能力引用私钥。也许 Windows 证书存储有一个从您期望的证书到 HSM 的链接条目。 -
Pkcs11Interop.X509Store 项目可以为您完成所有繁重的工作。更多详情take a look at my older answer to similar question.
-
@TEngineer X509Certificate2::PrivateKey 只能与基于 CSP/CNG 的密钥一起使用。您不能与基于 PKCS#11 的密钥一起使用。这就是我启动 Pkcs11Interop.X509Store 项目的原因之一。
标签: c# .net rsa hsm pkcs11interop