1

私のコードでは、すべてのローカルIISサイトを列挙し、サイトごとにポート443の証明書を検証しようとしています。

using( var sm = new ServerManager() ) {
  foreach( var site in sm.Sites ) {
    foreach( var binding in site.Bindings ) {
       if( binding.EndPoint.Port == 443 ) {
          var thumbprint = binding.CertificateHash;
          var storeName = binding.CertificateStoreName;
          //validation here...
       }
    }
  }
}

このコードは、16進表現に変換するstoreName存在"MY"と存在のバイト配列を生成します。thumbprint

これで、「検証」部分は次のように機能します。

var store = new X509Store("MY");
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates;
//find and validate my cert
store.Close();

このコードは空のコレクションを生成します。しかし、私が変わると

var store = new X509Store("MY");

var store = new X509Store(StoreLocation.LocalMachine);

次に、コードは2つの証明書を持つコレクションを生成し、そのうちの1つには正しいフィンガープリントがあり、検証できます。

Binding証明書ストア名を返すのに、その名前の証明書がストアに見つからないのはなぜですか?

4

2 に答える 2

3

店名と店の場所は違います。

IIS のすべての証明書は、特定のユーザー アカウントの証明書ではなく、ローカル コンピューターの場所に保存されます。

これは、2番目の例が呼び出している をX509Store受け取るだけのコンストラクタの外観です。StoreLocation

public X509Store(StoreLocation storeLocation) : this("MY", storeLocation)
{
}

これは、店舗名と場所の両方を取るコンストラクターを呼び出しています。

最初の例:

var store = new X509Store("MY");

ローカル マシンではなく、のMYストアを開いています。CurrentUserだから、あなたは間違った店を探しています。名前と場所の両方を取るコンストラクターの使用に切り替えます。

于 2013-03-01T10:37:21.127 に答える
0

このメソッドは証明書を取得します:

private X509Certificate2 GetServiceCertificate(String certificateSubjectName, StoreName storeName = StoreName.My, StoreLocation storeLocation = StoreLocation.CurrentUser)
{
    X509Store certificateStore = new X509Store(storeName, storeLocation);
    foreach (X509Certificate2 certificate in certificateStore.Certificates)
    {
        if (certificate.SubjectName.Name == certificateSubjectName)
        {
            return certificate;
        }
    }
    return null;
}
于 2013-03-01T10:41:50.633 に答える