我在使用智能卡以编程方式签署xml时遇到问题。当我使用弹出对话框传递pin代码时(当passPinAutomatically设置为false时)它可以工作,但是当我以编程方式传递pin代码时,我收到一个错误: 检测到智能卡但不是当前操作所需的智能卡。您使用的智能卡可能缺少必需的驱动程序软件或所需的证书。
代码可以在我的本地计算机和其他两台计算机上运行,但不能在生产计算机上运行。智能卡读卡器是OMNIKEY 6121,驱动程序是最新的,一切似乎都很好。 “智能卡”和“证书传播”服务正在运行。我已经在互联网上搜索了这个问题,但帖子中的所有解决方案对我都不起作用。
可能是什么问题?我在下面发布了部分源代码。您可以看到我收到的错误的图像。请帮忙,我的时间不多了?谢谢。
//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();