2017-04-04 56 views
0

我使用HttpClient與我的WebAPI服務進行通信。對於SSL認證,我成立了HttpClient的使用WebRequestHandler客戶端證書 -WebRequestHandler中的ClientCertificates

private static WebRequestHandler CreateWebRequestHandler(List<X509Certificate2> clientCertificates) 
    { 
     WebRequestHandler handler = new WebRequestHandler(); 

     if (clientCertificates != null && clientCertificates.Any()) 
     { 
      handler.ClientCertificateOptions = ClientCertificateOption.Manual; 
      clientCertificates.ForEach(cert => handler.ClientCertificates.Add(cert)); 
     } 

     return handler; 
    } 

在服務,我有一個自定義DelegatingHandler使用指紋驗證客戶端證書 -

protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    {   
     X509Certificate2 certificate = request.GetClientCertificate(); 
     // Code to validate certificate's Thumbprint with white listed thumbprints      
    } 

從HttpRequest的,我只能獲得一個客戶端證書。

我的問題:爲什麼WebRequestHandler允許設置一個ClientCertificates集合?它是否將所有客戶端證書提供給服務器?如果是,那麼我如何獲得DelegatingHandler中的客戶端證書列表?

回答

0

事實上,在服務器上獲得的TLS \ SSL握手過程中,客戶端只能向客戶端發送一個證書。選擇此證書的過程詳述如下here


簡單的解釋是 - 客戶會選擇從X509CertificateCollection尋找由服務器端和客戶端證書頒發者名稱提供的證書頒發者的列表之間的匹配最合適的證書。匹配的第一個證書發送到服務器。如果沒有證書匹配或證書集合爲空,則匿名憑證將發送到服務器。更好地描述TLS \ SSL工作的深層機制here

相關問題