1

我試圖使用HttpClientHandler.ServerCertificateCustomValidationCallback驗證客戶端證書。我用我的ChainPolicy參數構建了我的x509chain如何使用本地CRL文件(C#)在驗證過程中檢查客戶端證書吊銷

我本地有我的CRL(.pem)文件,我想將其添加到撤銷過程。

我正在考慮做一些類似CRL validation,用distributionPoint oid導入我的X509CertificateX509Extension,但我很難理解它。

下面是一段我的回調代碼

private static Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> 
    ServerCertificateCustomValidationCallback() 
{ 
    return (sender, cert, chain, sslPolicyErrors) => 
    { 
     X509Certificate2 ca = new X509Certificate2(@"pathToCa\\ca.crt"); 

     X509Chain chai = new X509Chain(); 
     chai.ChainPolicy.ExtraStore.Add(ca); 
     chai.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; 
     chai.ChainPolicy.RevocationMode = X509RevocationMode.Online; 
     chai.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags; 
     chai.ChainPolicy.VerificationTime = DateTime.Now; 
     try 
     { 
      if (!chai.Build(cert)) 
      { 
       return false; 
      } 
      foreach (X509ChainStatus status in chai.ChainStatus) 
      { 
       if (status.Status == X509ChainStatusFlags.UntrustedRoot) continue; 
       if (status.Status == X509ChainStatusFlags.OfflineRevocation) continue; 
       if (status.Status == X509ChainStatusFlags.RevocationStatusUnknown) continue; 
       return false; 
      } 

     } 
     catch (Exception e) 
     { 
      throw e; 
     } 

     return true; 
    }; 
} 

感謝您的幫助&澄清

+0

最新問題? –

+0

@Mike_G對不起,這是我的第一篇文章。我如何在撤銷過程中添加我的本地CRL文件? –

回答

0

如果你想舉辦自己的CRL,您將需要服務器架設的地方,所以它可以託管你的crl就像一個html頁面。

因此,舉例來說,如果你使用OpenSSL或最好LibreSSL創建自己的證書,在你的配置文件,您將添加如下內容:

crlDistributionPoints = URI:http://myserver.com/mycert.crl 
nsCaRevocationUrl = http://myserver.com/mycert.crl 

(你可以嘗試使用絕對路徑上面的鍵,但我不知道這會工作,如果它確實讓我知道)

有幾個教程,以幫助得到這個設置,https://jamielinux.com/docs/openssl-certificate-authority/是非常好的和詳細的。

在我自己做這件事的時候,我發現當你調用構建鏈時,.Net框架檢查鏈,所以你不需要添加額外的代碼來確保它自動檢查CRL。 (您可以檢查CRL正在獲取通過檢查你的服務器日誌文件)

您可以通過添加自己的證書到您的CRL測試這一點,你會發現,你得到

X509ChainStatusFlags.Revoked 

。希望幫助

+0

好的,你的解決方案運行良好,但我的問題是關於離線撤銷本地文件.. –

+0

你嘗試將nsCaRevocationUrl/crlDistributionPoints的路徑更改爲\\機器名\ c $ \ certrevlist \ my.crl –

+0

我有發現dotnet檢查只有crls與http來源:[dotnet cource](https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/System.Security.Cryptography.X509Certificates/src/Internal/Cryptography/Pal.Unix /CrlCache.cs#L255) –

相關問題