2011-07-26 11 views
13

私は、.NETアプリケーションをテストするユニットです。単体テストの中には、プログラムでX509Certificate2オブジェクトを生成するものがあります。どのように最小限のダミーX509Certificate2を作成するには?

実際の署名/秘密鍵/検証の内容は気にしません。フィールドの検査時に例外をスローしないオブジェクトが必要です。パラメータのないコンストラクタを使用しようとしましたが、アクセスされると例外がスローされます。デバッガに表示されるように:

SubjectName = '(新しいSystem.Collections.Generic.Mscorlib_CollectionDebugView(result.Certificates))。項目[0] .SubjectName'が 'System.Security.Cryptography.CryptographicException'型の例外をスローしました。

私もそれでいくつかのランダムな数字でバイト配列を渡してみましたが、それはさえ構築していなかった(配列は、特定のサイズである必要はない?)

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

+0

モグラは何ですか?回答として最終的な解決策を提供できますか?私は今同じことをやろうとしています。 – Langdon

+0

私は彼がMicrosoftの研究からテストスタブと迂回路を作成するためのフレームワークを意味すると考えます。こちらをご覧ください:http://research.microsoft.com/en-us/projects/moles/ – Sascha

答えて

8

私は次のことをお勧めします:

  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"); 

この時点で、あなたは限り証明書との相互作用などに行くために良いことがあります。単体テストのニーズが異なる場合は、さまざまなバリエーションを作成できます。ラングドンの要求、私が使用した溶液、自分自身で

+1

私は実際にバイト配列を一度*読み込んで、文字列としてファイルに出力し、それをソースコードにハードコードされたバイト[コピー]として貼り付けることができたと思いますか?それはあまりにも悪くないでしょう... – Cephron

+0

うん、それも働くだろう。 –

+0

Molesを使用して作業を終了しましたが、有益な回答をいただきありがとうございます。 – Cephron

1

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

私は、証明書にアクセスするだけのフィールドが、それはサブジェクト名と拇印だたし、私がアクセスサブジェクト名のフィールドだけだったので、これは働いていました名。ダミー文字列を返すために、これらのフィールドのゲッタメソッドを「成熟」しました。他のフィールドにアクセスする場合は、おそらくモルドにする必要があります。

それで、 "黒子" とは何ですか?

「モル委任に基づいている.NETのテストスタブと迂回するための軽量フレームワークである。モル封止さタイプで非仮想/静的メソッドを含む任意の.NETメソッドを迂回するために使用することができる。モル自由に利用可能ですビジュアルスタジオギャラリーまたはPexに同梱されています。

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

+1

彼のより一般的なジェイソンの答えは私の上に受け入れられました。 – Cephron

2

これは非常にハック見えるかもしれませんが、それはあなたがなりたい方法を実践的に依存して...私はマシンからランダムに証明書をつかむために使用したアプローチ。

これは次の場合に便利でした。 - これらのテストを実行しているすべてのマシンに有効な証明書があることを知っています。 - 私は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(); 
     } 
    } 
+1

これはテストのために素晴らしいです。パスワードに注意する必要はありますか? – Timo

0

さらに簡単な方法があります。

  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"); 
関連する問題