2017-12-11 8 views
1

クライアント証明書で内部的にアプリケーションを認証するために、makecertアプリケーションを使用してルート証明書とクライアント証明書を作成しました。makecertで証明書失効リスト(CRL)を作成し、pvk2pfxで.pfxにバンドルします。

すべてがうまく動作しますが、私はX509Certificate2 Verifyメソッドを使用するとき、私は次のエラーを取得する:

The revocation function was unable to check revocation for the certificate

X509Certificate2 cert = actionContext.Request.GetClientCertificate(); 
cert.Verify(); 

私はX509Chainを作成することでこれを回避して、RevocationMode = X509RevocationMode.NoCheckX509ChainPolicyを設定することができます。

X509Certificate2 cert = actionContext.Request.GetClientCertificate(); 

if (cert == null) 
{ 
    actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) 
    { 
     ReasonPhrase = "Client Certificate Required" 
    }; 
} 
else 
{ 
    X509Chain chain = new X509Chain(); 

    //Needed because the error "The revocation function was unable to check revocation for the certificate" will happen otherwise 
    chain.ChainPolicy = new X509ChainPolicy() 
    { 
     RevocationMode = X509RevocationMode.NoCheck, 
    }; 
    try 
    { 
     var chainBuilt = chain.Build(cert); 
     Debug.WriteLine(string.Format("Chain building status: {0}", chainBuilt)); 

     if (chainBuilt == false) 
     { 
      actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) 
      { 
       ReasonPhrase = "Client Certificate not valid" 
      }; 
      foreach (X509ChainStatus chainStatus in chain.ChainStatus) 
      { 
       Debug.WriteLine(string.Format("Chain error: {0} {1}", chainStatus.Status, chainStatus.StatusInformation)); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine(e.ToString()); 
    } 
} 

しかし、これは興味がありました。ある程度、Certificate Revocation List (CRL)makecertで作成してpvk2pfxという.pfxにバンドルすると、X509Certificate2 Verifyで受け付けられますか?

+0

「makecert」は廃止予定です:https://msdn.microsoft.com/en-us/library/windows/desktop/aa386968(v=vs.85).aspx。 'X509Certificate2.Verify()'のみに頼りたいのであれば、あなたのアプリケーションは世界規模の有効な証明書を受け入れるため、間違っています。 – Crypt32

+0

@ Crypt32入力していただきありがとうございます。私は、ルートCAから証明書が発行されていることを確認する別の方法があります。検証は、有効な証明書を送信していることを最初に確認することに過ぎません。 – Ogglas

+0

'X509Certificate2.Verify'は、フレームワークで最も無意味なメソッドの1つです。それが 'true'を返す場合は、コンテキスト内で有効かどうかを調べるために、おそらく同じチェーンを構築する必要があります。 'false'を返した場合は、自分自身でチェーンを構築してしまうことになり、"間違い "があなたに関係しているかどうかを判断できます。チェーンオブジェクトを手動で構築するほうが良いです。 – bartonjs

答えて

0

msdnで解決策が見つかりました。

https://msdn.microsoft.com/en-us/library/ff648732.aspx

あなたのルート証明書は、次のコマンドを実行して作成した後:

makecert -crl -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.crl 

サーバーとクライアントの両方のマシンでCRLファイルをインストールします。 MMCを使用して、信頼されたルート証明機関ストアのクライアントコンピュータとサーバーコンピュータにRootCATes.crlをインストールします。

MMC - >ファイル - >スナップインの追加と削除] - > [証明書] - > [ユーザーアカウント

信頼されたルート証明機関] - > [証明書] - >右クリック - > [すべてのタスク] - > [インポート] - > [RootCATest。私はpvk2pfxと一緒にバンドルすることはできませんでしたが、この後、私はVerifyを実行することができました。

関連する問題