2012-01-14 11 views
1

X509証明書情報で動作する必要があるコードがあります。私はこれを行うサンプルをダウンロードしました:.NETコードでX509証明書を操作する方法

const string CertWithoutPrivateKey = "MII...."; 
const string CertWithPrivateKey = "MII..."; 

public static SecurityToken GetSigningToken(bool includePrivateKey) 
{ 
    X509Certificate2 cert = null; 
    if (includePrivateKey) 
    { 
     cert = new X509Certificate2(
      Convert.FromBase64String(CertWithPrivateKey), 
      "pw", X509KeyStorageFlags.PersistKeySet); 
    } 
    else 
    { 
     cert = new X509Certificate2(
      Convert.FromBase64String(CertWithoutPrivateKey)); 
    } 
    return cert; 
} 

コードは秘密鍵で証明書を取得できる必要があります。 Saml2AuthenticationModule(SAML 2.0プロトコルのWIF拡張機能)は、この秘密鍵を使用して、SAML IDプロバイダから送信された情報を復号化します。

証明書や暗号化についてよく分かりませんが、証明書をクラスにハードコードすることは安全ではないようです。

私のコードで秘密鍵で証明書を取得するにはどうすればよいですか? Afaik、このコードはアプリの起動時に一度しか実行されません(アプリプールのリサイクル後もそうです)。私ができる

  1. ストアのconfigファイル内のAppSettingとしてCERT。 appSettingsが暗号化されている限り、これは安全ですか?
  2. 証明書をデータベースに格納します。
  3. 証明書をbin/App_Dataにファイルとして保存します。これはWeb上で読むことができないことを意味しますが、ホストサーバーにアクセスできる人なら誰でも簡単に見ることができます。私のサーバーに誰かが入ることができれば、この証明書を読ませることはおそらく私の心配の中では最少です。

その他のオプションはありますか?この場合、最も適切なのは何ですか?

答えて

1

WIFの仕組み(Reflectorを使用して証明書ストアとのやりとりの内部を見ることはできますが)は、IISでホストされているアプリケーションでWIFを使用しているようです。その場合は、WIFがすべての証明書のやり取りをあなたのために処理する必要があります。あなたはちょうどあなたが設定し、次のものを持っていることを確認する必要があります:

  1. あなたがいずれかの暗号化に使用したり、トークンのデジタル署名を検証する証明書の拇印を参照して設定しidentity model configuration section。プライベートキーの有無にかかわらず、アプリケーションプールのホスティングアイデンティティが秘密鍵の情報を抽出するための証明書を「読む」ためのアクセス許可を持っている必要があり
  2. certificate needs to be registered in IIS
  3. (受け入れ答えhereを参照)
+0

さらに、セキュリティの観点から、オプション1〜3が望ましいとは思わない。すべてがWindowsの証明書ストアで生きて管理されるべきです。 –

+0

答えをありがとう。問題は、これらのWIF拡張機能はCTPにあります:(identityModel設定には信頼できる発行者(IdP)の拇印がありますが、この証明書は私のアプリケーション用です(サービスプロバイダ)。これは、X509Storeのインスタンスを使用して行うことができます。 – danludwig

2

証明することができますユーザーまたはコンピュータのX509ストアに保存します。これにはすでに十分なはずのビルドインWindowsセキュリティがあります。証明書スナップインでmmcを使用して、証明書をストアに追加して管理することができます。

証明書への参照(例:名前またはサムネイル)を設定ファイルに保存し、証明書の取得に使用できます。検索は次のようになります。

public static X509Certificate2 GetCertificate(string name) 
{ 
    try 
    { 
     X509Store store = new X509Store (StoreLocation.LocalMachine); 
     X509Certificate2Collection collection = store.Certificates; 
     foreach (X509Certificate2 x509 in collection) 
     { 
      if (x509.FriendlyName.Equals(name)) 
      { 
       return x509; 
      } 
     } 
    } 
    finally 
    { 
     store.Close(); 
    } 
    return null; 
} 

コレクションにFindを使用して証明書を検索するための別の(そしてクリーナー)の方法です。

+0

証明書コレクションを反復処理するか、Findメソッドを呼び出す方が効率的ですか? – danludwig

+0

右には、「検索」が効率的になります。 –

関連する問題