2

我在使用智能卡以编程方式签署 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();
4

0 回答 0