24

私は.NETアプリケーションの単体テストを行っています。単体テストの中には、プログラムでX509Certificate2オブジェクトを生成するものがあります。

実際の署名/秘密鍵/検証に関するものは気にしません。フィールドを調べたときに例外をスローしないオブジェクトが欲しいだけです。パラメーターなしのコンストラクターを使用してみましたが、アクセスすると、多数のフィールドが例外をスローします。デバッガーで見られるように:

SubjectName ='(new System.Collections.Generic.Mscorlib_CollectionDebugView(result.Certificates))。Items[0].SubjectName'はタイプ'System.Security.Cryptography.CryptographicException'の例外をスローしました

また、いくつかの乱数を含むバイト配列を渡そうとしましたが、それは構築されませんでした(配列は特定のサイズである必要がありますか?)

それで、質問:フィールド/プロパティアクセス時に例外をスローしないX509Certificate2オブジェクトをプログラムで生成する最も簡単な(コードの最も少ない行)方法は何ですか?

4

4 に答える 4

10

私は次のことを提案します:

  1. makecertを使用して証明書を生成します。
  2. 証明書をプロジェクトに追加し、そのビルドアクションを埋め込みリソースに変更します。
  3. 単体テストセットアップのリソースから証明書をロードします。以下を参照してください。

コード:

byte[] embeddedCert;
Assembly thisAssembly = Assembly.GetAssembly(typeof(MyType));
using (Stream certStream = thisAssembly.GetManifestResourceStream("YourProjectName.localhost.pfx"))
{
  embeddedCert = new byte[certStream.Length];
  certStream.Read(embeddedCert, 0, (int)certStream.Length);
}

_signingCert = new X509Certificate2(embeddedCert, "password");

この時点で、証明書を操作するところまで進んでください。単体テストのニーズが異なる場合は、さまざまなバリアントを作成できます。

于 2011-07-26T21:00:23.007 に答える
4

これは非常にハッキーに思えるかもしれませんが、それはあなたがどれだけ実用的になりたいかによって異なります...私が使用したアプローチは、マシンからランダムな証明書を取得することでした。

これは、次の場合に役立ちました。-これらのテストを実行しているすべてのマシンに有効な証明書があることを知っています。-私はGITを使用していて、証明書のバイナリファイルをチェックインしたくありませんでした-証明書の内容は気にしません-モックフレンドリーではなく、モック不可能なX509Certificateオブジェクトを明示的に必要とするコードを使用しています。

確かに防弾ではありませんが、私をブロック解除し、テストシナリオのブロックを解除しました。

    static X509Certificate2 GetRandomCertificate()
    {
        X509Store st = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        st.Open(OpenFlags.ReadOnly);
        try
        {
            var certCollection = st.Certificates;

            if (certCollection.Count == 0)
            {
                return null;
            }
            return certCollection[0];
        }
        finally
        {
            st.Close();
        }
    }
于 2014-04-15T20:06:11.737 に答える
1

ラングドンの要請で、私が使用した解決策は、私自身です。

        //Moling test Certificate
        var cert = new MX509Certificate2();
        var subject = new MX500DistinguishedName();
        // hookup
        cert.SubjectNameGet = () => subject;
        cert.ThumbprintGet = () => "foo";
        subject.NameGet = () => "foobar";

これが機能したのは、証明書でアクセスしたフィールドがSubjectNameとThumbprintだけであり、アクセスしたSubjectNameのフィールドが名前だけだったためです。これらのフィールドのgetterメソッドを「moled」して、ダミー文字列を返しました。他のフィールドにアクセスする場合は、おそらくそれらをモグラする必要があります。

それで、「モル」とは何ですか?

「Molesは、デリゲートに基づく.NETのテストスタブと迂回のための軽量フレームワークです。Molesは、封印されたタイプの非仮想/静的メソッドを含む、任意の.NETメソッドを迂回するために使用できます。MolesはVisualStudioGalleryで無料で入手できます。またはPexにバンドルされています。」

http://research.microsoft.com/en-us/projects/moles/

于 2011-07-28T19:49:27.340 に答える
0

それを行うもう1つの簡単な方法があります。

  1. MakeCertを使用して証明書を作成するか、既存の証明書をエクスポートします。
  2. プロジェクト(App_Dataフォルダー)に証明書を追加します。
  3. 以下の手順に従って証明書を取得してください。

コード:

        string certificate = "cert.pfx";
        string certPath = string.Format("{0}/App_Data/{1}", HttpRuntime.AppDomainAppPath, certificate);
        byte[] bytes = Util.FileToArray(certPath);
        X509Certificate2 publicKey = new X509Certificate2(bytes, "somepassoword");
于 2016-12-14T16:45:27.923 に答える