0

с помощью: .net 4.0, VS2010 и webapi1.0 Я следовал этой ссылке http://southworks.com/blog/2014/06/16/enabling-ssl-client-certificates-in-asp-net-web-api/сертификат клиента не приходит через

для обеспечения соблюдения клиентов для отправки сертификата Аутентифицировать

На стороне сервера код выглядит ниже

public class RequireCertificateFilter : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(HttpActionContext actionContext) 
      { 


       var request = actionContext.Request; 

       if (!this.AuthorizeRequest(request.GetClientCertificate())) 
       { 
        throw new HttpResponseException(HttpStatusCode.Forbidden); 
       } 

      } 

      private bool AuthorizeRequest(System.Security.Cryptography.X509Certificates.X509Certificate2 x509Certificate2) 
      { 
       bool result = false; 
       if (x509Certificate2 != null) 
       { 
        string issuer = x509Certificate2.Issuer; 
        string subject = x509Certificate2.Subject; 
        result = true; 
       } 
       return result; 
      } 

request.GetClientCertificate() Всегда возвращать null Я не вижу никаких других настроек? не знаете, почему сертификат клиента не проходит?

Клиентский код выглядит ниже

 X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
      store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); 
      var cert = store.Certificates.Find(X509FindType.FindBySubjectName, "ClientCertificatesTest", true)[0]; 


    // Build HTTP Request 
      HttpWebRequest wrStatus = (HttpWebRequest)WebRequest.Create("https://localhost/TestAPI/api/Home");   
      wrStatus.KeepAlive = true; 
      wrStatus.Method = WebRequestMethods.Http.Get; 
      wrStatus.Accept = "text/xml"; 
      wrStatus.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"; 
      wrStatus.ClientCertificates.Clear(); 
      wrStatus.ClientCertificates.Add(cert); 


      string result = null; 
      using (HttpWebResponse resp = (HttpWebResponse)wrStatus.GetResponse()) 
      { 
      StreamReader reader = new StreamReader(resp.GetResponseStream()); 
      result = reader.ReadToEnd(); 
      } 

      } 

Update:

Я попытался с помощью скрипача и отлажена через код, где он называет GetResponse и вот что я вернусь

enter image description here

+0

Возможно, такая же проблема, как http://stackoverflow.com/questions/22817965/httprequestmessage-getclientcertificate-returns-null-in-web-api - к сожалению, там нет принятого ответа. – Lucero

+0

Я бы попытался использовать Fiddler для перехвата и анализа трафика SSL, чтобы проверить, действительно ли сертификат клиента отправлен на сервер или нет. Кроме того, вы должны убедиться (например, с помощью MMC), что клиент использует сертификат с закрытым ключом, только часть государственного сертификата не будет работать. – Lucero

+0

@ Lucero: Как обеспечить, чтобы обе части использовались в MMC? Все, что я называю ClientCertificatesTest, это неправильно? – Gauls

ответ

0

Ваш сертификат клиента не является надежным, поскольку цепочка доверия терпит неудачу и, как следствие, предполагаемый. Я полагаю, что ссылка southworks.com, которую вы опубликовали, делает предположение, что код клиента и сервера работает в одном окне. Если вы используете отдельный сервер для вашего кода сервера, он не сможет проверить ваш сертификат клиента, если вы не установите ваш собственный сертификат CA (DevelopmentCA.cer) в Доверенные корневые центры сертификации.

Смежные вопросы