2017-10-19 15 views
0

署名付きトークンを受け取るWebアプリケーションがあり、エンドユーザーのマシンにあらかじめインストールされている証明書でその署名を検証する必要があります。私は店にアクセスし、私が使用したいと思っている特定の証明書を取得したいと思います。今まで私は店に通ってその中の証明書を数えることができますが、特定の証明書を見つけることができません。Windows証明書ストア(C# - ASP.Net)から特定の証明書を探す

私の戦略は正確な必須証明書を選ぶのに十分なユニークなので、件名による証明書の検索結果をX509Certificate2Collectionで埋めることです。コレクションの最初の要素(うまくいけば唯一)を引き出し、これは私が下のコードでやっていることですが、これまでのところ、私はいつも例外としてcertsが空で、何も文字列に変換できません。

シリアルナンバーで検索しても、証明書のシリアル番号が00で、私のストアに8つあります。

特定の証明書をストアから取得し、プログラムで使用するにはどうすればよいですか?

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
      st0re.Open(OpenFlags.ReadOnly); 
      count = st0re.Certificates.Count;  //Count the certificates in the store 
      X509Certificate2Collection certs = st0re.Certificates.Find(
       X509FindType.FindBySubjectName, 
       "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
       true); 
      st0re.Close(); 

      Output = certs[0].ToString();  // = count.ToString() 
+0

「エンドユーザのマシンで」 - つまり、リモートクライアントですか?地獄、いいえ!あなたが何か悪いことをしようとしているので、申し訳ありません。 Webアプリケーションはクライアントリソースにアクセスできません。そうしないでください。同様の質問に対する説明があります:https://stackoverflow.com/a/46707759/3997611 – Crypt32

+0

私は何をしようとしているのかを明確にします。 私はサードパーティのSSOに接続された複数のWebアプリケーションを持っていますサーバーでは、ユーザーがURLに移動すると、そのSSOサーバーにリダイレクトされてログインし、署名されたCookieでリダイレクトされます。私は制限されたページに彼を放つ前に、そのクッキーを確認したい。だから私は証明書を読み込んでそれを使ってトークンの署名を検証したいだけです。 – j0zeft

+0

上記のリンクを見てください。 Webアプリケーションでクライアントリソースにアクセスできない、またはアクセスしない理由を明確に説明しています。必要な情報は、Webアプリケーションで事前に設定するか、基盤プロトコルにそのような機能がある場合はクライアントから提供する必要があります。あなたの場合、Cookieに証明書が含まれていない場合は、ローカル(Webサーバー)証明書ストアを使用して署名を検証するために必要な証明書を取得する必要があります。 – Crypt32

答えて

0

はCrypt32 @からの提案を検討した後、私は、アプリケーションがホストされる場所に自分のトークンを移動するので、この方法では、私は、証明書のために、エンドユーザーのマシン上で見ていないんだけど、その代わりに、ローカルになりますアプリケーションをホストするサーバーに格納されます。トークンを検索するには、私は非常にわずかな編集と疑問にそこまで正確に同じコードを使用します。

X509Store st0re = new X509Store(StoreName.Root, StoreLocation.CurrentUser); 
     st0re.Open(OpenFlags.ReadOnly); 
     count = st0re.Certificates.Count;  //Count the certificates in the store 
     X509Certificate2Collection certs = st0re.Certificates.Find(
      X509FindType.FindBySubjectDistinguishedName, 
      "C=US, S=WA, L=Redmond, O=Microsoft Corporation, OU=Web Services", 
      true); 
     st0re.Close(); 

     Output = certs[0].ToString();  // = count.ToString() 

私はすべて、この場合X509FindType.FindBySubjectDistinguishedName で、証明書のサブジェクト内のすべての要素をX509FindType.FindBySubjectNameを交換しましたその正確な形式でリストされなければなりません。

関連する問題