无法使用智能卡以编程方式签名xml

时间:2013-07-01 07:33:42

标签: c# .net cryptography smartcard

我在使用智能卡以编程方式签署xml时遇到问题。当我使用弹出对话框传递pin代码时(当passPinAutomatically设置为false时)它可以工作,但是当我以编程方式传递pin代码时,我收到一个错误: 检测到智能卡但不是当前操作所需的智能卡。您使用的智能卡可能缺少必需的驱动程序软件或所需的证书。

代码可以在我的本地计算机和其他两台计算机上运行,​​但不能在生产计算机上运行。智能卡读卡器是OMNIKEY 6121,驱动程序是最新的,一切似乎都很好。 “智能卡”和“证书传播”服务正在运行。我已经在互联网上搜索了这个问题,但帖子中的所有解决方案对我都不起作用。

可能是什么问题?我在下面发布了部分源代码。您可以看到我收到的错误的图像。请帮忙,我的时间不多了?谢谢。

enter image description here

//X509Certificate2 certificate ... certificate object
//string pin ... pinCode

CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer | CspProviderFlags.UseExistingKey;

SecureString pwd = new SecureString();
foreach (var c in pin)
{
    pwd.AppendChar(c);
}
csp.KeyPassword = pwd;
csp.KeyNumber = (int)KeyNumber.Signature;

RSACryptoServiceProvider rsa;
if (!passPinAutomatically)
{
    rsa = (RSACryptoServiceProvider)certificate.PrivateKey;
}
else
{
    rsa = new RSACryptoServiceProvider(csp);
}

KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certificate));

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<signature></signature>");
SignedXml signedXml = new SignedXml(xmlDocument);
signedXml.KeyInfo = keyInfo;
signedXml.SigningKey = rsa;

Reference reference = new Reference();
reference.Uri = String.Empty;

XmlDsigEnvelopedSignatureTransform transform = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(transform);
signedXml.AddReference(reference);
signedXml.ComputeSignature();

string signedXmlText = signedXml.GetXml().InnerXml;

Console.WriteLine(signedXml);
Console.ReadLine();

0 个答案:

没有答案