スマート カードを使用してプログラムで xml に署名する際に問題があります。ポップアップ ダイアログを使用して PIN コードを渡すと (passPinAutomatically が false に設定されている場合)、動作しますが、プログラムで PIN コードを渡すと、次のエラーが表示されます。スマート カードが検出されましたが、現在の操作に必要なものではありません。使用しているスマート カードに、必要なドライバー ソフトウェアまたは必要な証明書がない可能性があります。
コードはローカル マシンと他の 2 台のマシンで動作しますが、運用マシンでは動作しません。スマート カード リーダーは 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();