2

スマート カードを使用してプログラムで 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();
4

0 に答える 0