2016-02-24 19 views
6

Geçersiz bir sertifikaya sahip bir SignalR sunucusuna bağlanmayı deniyorum. Eğer sertifika doğrulama davranışını değiştirmek için izin bir ServerCertificateValidationCallback temsilci olan bir WebRequestHandler ile inşa edebilirC# signalr istemcisindeki https sertifika uyarılarını nasıl yok sayabilirim?

System.Net.Http.HttpRequestException : An error occurred while sending the request. 
----> System.Net.WebException : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. 
    ----> System.Security.Authentication.AuthenticationException : The remote certificate is invalid according to the validation procedure. 

Normal Net HttpClient olarak: Beklenildiği aşağıdaki hatayı alıyorum. SignalR HttpClient'un bunlardan hiçbiri yok gibi görünüyor.

cevap

8

ServerCertificateValidationCallback olay için bir yöntem kaydettirmeniz gerekiyor.

Bu kod, olay tetiklendiğinde geçerli olan anonim bir yöntemi kaydeder.

ServicePointManager.ServerCertificateValidationCallback += 
        (sender, certificate, chain, sslPolicyErrors) => true; 

Dikkatli olun, bu genel bir ayardır. Yani tüm ssl/tls signalr ister veya http bu ayarı kullanır.

+0

Bu işe yarıyor, teşekkürler. Global, harika değil ama bunu bir test montajında ​​kullanıyorum, bu yüzden yeterince iyi. – Dan

1

Çalıştığını düşündüğüm ancak genel olarak tavsiye edilmeyen ServicePointManager.ServerCertificateValidationCallback yaklaşımı gibi global olmayan bir yöntem buldum. Benim HubConnection örneğinde "Başlat" çağırdığınızda şöyle

class CustomHttpClient : DefaultHttpClient 
    { 
     private readonly System.Net.Security.RemoteCertificateValidationCallback _serverCertificateValidationCallback; 

     public CustomHttpClient (System.Net.Security.RemoteCertificateValidationCallback serverCertificateValidationCallback) : base() 
     { 
      this._serverCertificateValidationCallback = serverCertificateValidationCallback; 
     } 

     protected override HttpMessageHandler CreateHandler() 
     { 
      var rv = base.CreateHandler() as WebRequestHandler; 
      if (this._serverCertificateValidationCallback != null) 
       rv.ServerCertificateValidationCallback = this._serverCertificateValidationCallback; 
      return rv; 
     } 
    } 

Şimdi benim özel HttpClient uygulama kullanabilirsiniz: Ben şöyle SignalR "DefaultHttpClient" sınıfının bir alt yaparak başladı

var hubConnection = new HubConnection("my server url"); 
var myHub = hubConnection.CreateHubProxy("my hub name"); 
hubConnection.Start(new CustomHttpClient((sender, certificate, chain, sslPolicyErrors) => 
       { 
        //put some validation logic here if you want to. 
        return true; 
       })); 

Bu, sunucu sertifikasını uygun gördüğünüz şekilde doğrulamanıza izin vermeli, ancak uygulamanızdaki tüm HTTP trafiğini etkilemek yerine kapsamı geçerli HubConnection ürününde tutmalıdır.

İlgili konular