2016-09-15 7 views
2

私はX509Storeと彼の友達、X509Certificate2X509Certificate2Collectionを使っています。すべてうまくいきましたが、自分のコードのテストを書くようになりました。問題に遭遇しました。私は新しいテスト証明書を生成し、それをインストールして各テストを開始し、最後にテスト証明書を削除します。テスト証明書は、作成日が過去1日で、有効期限が1日後であっても、確定的ではありません。X509Storeを正しく使うには?

私は、完全なGCを実行し、TearDownでファイナライザを待っていることがテストを修正していることに気付きました。

ここではリファレンスソースを掘り下げています。 X509Certificate2を削除する必要があると思われます。そうでないと、ストアに追加するなど、すでに成功した操作は実際のストアにフラッシュされませんでした(これはWindows APIの動作です。CertCloseStoreCRYPT_E_PENDING_CLOSEの結果を参照)。

さらにX509Certificate2Collectionは基本的にはList<X509Certificate2>と思われるので、このような証明書のリストが作成されるたびに、店舗のCertificatesプロパティを読み取るなど、すべてのインスタンスを廃棄する必要があります。

Find方法を使用される時は、これは、一時的なストアを作成本命を追加して、アンマネージコードから再び本命を読み、またすべてをする必要が本命の新しいコレクションを作成する必要が配置される。

これは本当にX509Storeを使用する正しい方法ですか? .NET APIが非常に安全でなく、どこでも静かな失敗と完全に文書化されていない失敗モードで正しく使用するのは信じられないようです。明白な何かを見逃しているのでしょうか、これらのクラスをすべて避けるべきですか?

+2

[これはドキュメントに記載されています](https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store(v = vs.110).aspx): 'Starting .NET Framework 4.6では、この型はIDisposableインターフェイスを実装します。あなたがタイプの使用を終えたら、それを直接的または間接的に処分するべきです。 –

+0

あなたは単に '使用する 'ことはできませんか? – starmandeluxe

答えて

1

文書化されていない障害モードは何ですか?自分が所有しているすべての使い捨てオブジェクトを1つずつ処分することになっています。これは特にのネイティブコードを扱っている場合に当てはまります。これは、証明書インタフェースに特有のものではなく、ファイルは同じ方法で動作し、データベーストランザクションは同じ方法で動作し、ソケットは同じように動作します。だから、最初の場所にIDisposableインターフェイスが存在する理由です。これは、「完了したら電話してください」という一般的なインターフェイスです。 がファイルを閉じることを実現したときにファイルI/Oの使用を停止しましたか?ファイルを閉じますか?それとも、それはまだ必要であることに気付かなかったのですか?

SChannelを処理する暗号化モジュール全体は、SChannelの上にある薄いラッパーにすぎません。つまり、ネイティブのinterop、ネイティブオブジェクトなどの管理されたラッパーなど、ほとんどすべてのことがあります。

ただし、正確な問題は何であれ問題ではありません。要点は、あなたがいつもディスポーザブルを処分するはずだということです。ちょうど物事は仕事の種類のように見える場合でも、それはオブジェクトを処分することを省略しても問題ないわけではありません。

+0

ええ、私はそれらを所有していません。私はちょうど店で財産を読んだ。それは私が突然店のすべての証明書のコピーを所有していることを示すものではありません。 Findメソッドは、私が突然別のコピーを所有していることを絶対に示唆していません。インターフェイスは、私がこれらのものの所有権を取ることになっていること、あるいはどんなリソースも作成されていることを少しでも示していません。これが.NET 4.6より前にどのように使用されていたのかは言えません。あるいは、ランダムに成功した恐ろしい「操作が起こらなかった」ということを何らかの形でチェックしているようなものです。コレクションそのものは使い捨てでもありません。 – Puppy

+0

@Puppyさて、あなたはドキュメントを読む必要があります。ストアは閉じられているはずです(「使用後にX.509証明書ストアを閉じる必要があります。」.NET 2.0ドキュメント以降)。そして、Closeメソッドは最初から存在しています。確かに、元々店に「IDisposable」を入れないのは見落としだった。しかし、私はまだあなたが言及した他のすべてのシナリオで(そして、私が言及しなかったことがたくさんある)恐ろしい「成功した操作は無作為に起こらなかった」とみなさないことは興味深いことがいまだにわかります。 .NETは管理された*オブジェクトのみを保証します。 X509ストアは管理されません。 – Luaan

+0

これらの他のすべてのケースでは、正しさは、あなたが作成しようとしたことのない他のオブジェクトを処分することに依存するものではなく、 – Puppy