18

私は問題に取り組んできました。多分、皆さんは私を正しい方向に向けることができます.

https接続を介して、Webサーバー上でpdfにデジタル署名しようとしています。

ページの読み込み時に私はそうしています:

HttpClientCertificate cs = Request.ClientCertificate;
X509Certificate card = new X509Certificate(cs.Certificate);
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
 Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(card.GetRawCertData())};

コードの最後の行で、「m_safeCertContext は無効なハンドルです」というエラーが表示されます。

その点に注意してください:

  • 2 つの完全に異なる証明書を使用しても同じエラーが発生します。
  • 証明書は "card" 変数に取得されています。
  • 以前はカードを X509Certificate2 に取得していましたが、昨日どこかで読んだところ、X509Certificate としてキャストしてから X509Certificate2 にダウンキャストすることでエラーを解決できることがわかりませんでした。それは「うーん...これは意味がありませんが、まだ試していません」という瞬間の1つでした。
  • すべてのメソッドとクラスにプロパティを追加[System.Security.SecurityCritical, System.Security.SecurityTreatAsSafe]して、それが機能するかどうかを確認しようとしました...そのような運はありません。

誰でもヒントを教えてもらえますか?

4

3 に答える 3

16

これは、暗号化で初期化されていないフィールドにアクセスするたびに発生する可能性があります。

コードで、Request.ClientCertificate未加工の証明書データを持たないオブジェクトを返すとcard.GetRawCertData()、4 行目の呼び出し時にエラーが表示されます。

簡単なテストとして、次のことを試してください。

var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2();
Console.WriteLine(cert.Thumbprint);

使用可能な拇印がないため、次の例外がスローされます。

m_safeCertContext is an invalid handle.

指定されたスタック トレースで:

at System.Security.Cryptography.X509Certificates.X509Certificate.ThrowIfContextInvalid()
at System.Security.Cryptography.X509Certificates.X509Certificate.SetThumbprint()
at System.Security.Cryptography.X509Certificates.X509Certificate.GetCertHashString()
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_Thumbprint()
at MyEncryptionUtility.EncryptionUtilityForm.button1_Click(Object sender, EventArgs e) in C:\MyEncryptionUtility\EncryptionUtilityForm.cs:line 2864
于 2013-11-21T19:45:39.547 に答える
2

これはあなたの問題ではないようですが、他の人にとっては、証明書関連のプロパティまたはメソッドにアクセスする前に X509Certificate2.Reset() を呼び出さないでください。

于 2016-12-12T14:58:11.040 に答える