2017-11-30 6 views
0

Kann mir jemand sagen, warum dies eine Fehlermeldung über das ungültige Zertifikat ausgibt? In PowerShell, wenn ich die IP-Adresse in Invoke-WebRequest verwenden und den Host-Header auf den CN im Zertifikat übereinstimmen, erhalte ich keine Cert-Fehler. Ich würde annehmen, dass HttpClient wäre das gleiche?HttpClient Certificate Errors

var spHandler = new HttpClientHandler(); 
var spClient = new HttpClient(spHandler); 
spClient.BaseAddress = new Uri("https://10.0.0.24"); 
var spRequest = new HttpRequestMessage(HttpMethod.Get, "/api/controller/"); 
spRequest.Headers.Host = "somehost.com"; 
var spResponse = await spClient.SendAsync(spRequest); 

Fehler:

WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. 
AuthenticationException: The remote certificate is invalid according to the validation procedure. 

Dieser Code Teil eines Überwachungsprogrammes ist, und wir müssen jeden Web-Frontend hinter einem Load Balancer sondieren zu können. Wir machen das sehr oft mit PowerShell und ich habe dieses Problem noch nie gesehen, solange ich den Host-Header so eingestellt habe, dass er dem Zertifikat entspricht.

Antwort

0

Das Standardverhalten in HttpClient ist, den Fehler zu werfen, wenn ein Problem mit dem Zertifikat auftritt.

Wenn Sie dieses Verhalten umgehen möchten, können Sie Ihren Code das ändern:

var spHandler = new HttpClientHandler() 
{ 
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => 
    { 
    Console.WriteLine($"Sender: {sender}"); 
    Console.WriteLine($"cert: {cert}"); 
    Console.WriteLine($"chain: {chain}"); 
    Console.WriteLine($"sslPolicyErrors: {sslPolicyErrors}"); 
    return true; 
    } 
}; 

var spClient = new HttpClient(spHandler); 
spClient.BaseAddress = new Uri("https://10.0.0.24"); 
var spRequest = new HttpRequestMessage(HttpMethod.Get, "/api/controller/"); 
spRequest.Headers.Host = "somehost.com"; 
var spResponse = await spClient.SendAsync(spRequest); 

das All Console.WriteLine Zeug ist nur das Zertifikat Informationen zu sehen, können Sie das löschen, nachdem Sie verstehen, was los ist auf.

Die return true ist, was das Zertifikat Problem umgehen.

Seien Sie vorsichtig bei der Verwendung in der Produktion, die beste Lösung wäre die Überprüfung der Zertifikatsprobleme.