C# Certificaatfouten negeren?

Ik krijg de volgende foutmelding tijdens een webserviceverzoek aan een externe webservice:

Kan geen vertrouwensrelatie tot stand brengen voor het beveiligde SSL/TLS-kanaal. —> System.Security.Authentication.AuthenticationException: het externe certificaat is ongeldig volgens de validatieprocedure.

Is er een manier om deze fout te negeren en door te gaan?

Het lijkt erop dat het externe certificaat niet is ondertekend.

De site waarmee ik verbinding maak is www.czebox.cz– dus voel je vrij om de site te bezoeken en merk op dat zelfs browsers beveiligingsuitzonderingen maken.


Antwoord 1, autoriteit 100%

Voeg een handler voor certificaatvalidatie toe. Als u trueretourneert, kunt u de validatiefout negeren:

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

Antwoord 2, autoriteit 17%

Het toestaan ​​van alle certificaten is erg krachtig, maar het kan ook gevaarlijk zijn. Als u alleen geldige certificaten plus enkele bepaalde certificaten wilt toestaan, kunt u dit als volgt doen.

.Net kern:

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }
        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}

.Net-framework:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (
    object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;   //Is valid
    }
    if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
    {
        return true;
    }
    return false;
};

Bijwerken:

Hoe de waarde van cert.GetCertHashString()in Chrome te verkrijgen:

Klik op Secureof Not Securein de adresbalk.

voer hier de afbeeldingsbeschrijving in

voer hier de afbeeldingsbeschrijving in

Klik vervolgens op Certificaat -> Details -> Maak een vingerafdruk en kopieer de waarde. Vergeet niet om cert.GetCertHashString().ToLower()te doen.

voer hier de afbeeldingsbeschrijving in


Antwoord 3, autoriteit 8%

NegeerBadCertificates-methode:

//I use a method to ignore bad certs caused by misc errors
IgnoreBadCertificates();
// after the Ignore call i can do what ever i want...
HttpWebRequest request_data = System.Net.WebRequest.Create(urlquerystring) as HttpWebRequest;
/*
and below the Methods we are using...
*/
/// <summary>
/// Together with the AcceptAllCertifications method right
/// below this causes to bypass errors caused by SLL-Errors.
/// </summary>
public static void IgnoreBadCertificates()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
}  
/// <summary>
/// In Short: the Method solves the Problem of broken Certificates.
/// Sometime when requesting Data and the sending Webserverconnection
/// is based on a SSL Connection, an Error is caused by Servers whoes
/// Certificate(s) have Errors. Like when the Cert is out of date
/// and much more... So at this point when calling the method,
/// this behaviour is prevented
/// </summary>
/// <param name="sender"></param>
/// <param name="certification"></param>
/// <param name="chain"></param>
/// <param name="sslPolicyErrors"></param>
/// <returns>true</returns>
private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
} 

Antwoord 4, autoriteit 7%

De reden waarom het niet werkt, is niet omdat het niet is ondertekend, maar omdat het basiscertificaat niet wordt vertrouwd door uw client. In plaats van SSL-validatie uit te schakelen, zou een alternatieve benadering zijn om het root-CA-certificaat toe te voegen aan de lijst met CA’s die uw app vertrouwt.

Dit is het root-CA-certificaat dat uw app momenteel niet vertrouwt:

-----BEGIN CERTIFICATE-----
MIIFnDCCBISgAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJDWjEs
MCoGA1UECgwjxIxlc2vDoSBwb8WhdGEsIHMucC4gW0nEjCA0NzExNDk4M10xHjAc
BgNVBAMTFVBvc3RTaWdudW0gUm9vdCBRQ0EgMjAeFw0xMDAxMTkwODA0MzFaFw0y
NTAxMTkwODA0MzFaMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoFz8yBxf
2gf1uN0GGXknvGHwurpp4Lw3ZPWZB6nEBDGjSGIXK0Or6Xa3ZT+tVDTeUUjT133G
7Vs51D6z/ShWy+9T7a1f6XInakewyFj8PT0EdZ4tAybNYdEUO/dShg2WvUyfZfXH
0jmmZm6qUDy0VfKQfiyWchQRi/Ax6zXaU2+X3hXBfvRMr5l6zgxYVATEyxCfOLM9
a5U6lhpyCDf2Gg6dPc5Cy6QwYGGpYER1fzLGsN9stdutkwlP13DHU1Sp6W5ywtfL
owYaV1bqOOdARbAoJ7q8LO6EBjyIVr03mFusPaMCOzcEn3zL5XafknM36Vqtdmqz
iWR+3URAUgqE0wIDAQABo4ICaTCCAmUwgaUGA1UdHwSBnTCBmjAxoC+gLYYraHR0
cDovL3d3dy5wb3N0c2lnbnVtLmN6L2NybC9wc3Jvb3RxY2EyLmNybDAyoDCgLoYs
aHR0cDovL3d3dzIucG9zdHNpZ251bS5jei9jcmwvcHNyb290cWNhMi5jcmwwMaAv
oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcmww
gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50
byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw
b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp
cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk
aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp
b25zMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQW
BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw+r+
S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN
5OTjbpOTEEkq2jFI0tUhtRx//6zwuqJCzfO/KqggUrHBca+GV/qXcNzNAlytyM71
fMv/VwgL9gBHTN/IFIw100JbciI23yFQTdF/UoEfK/m+IFfirxSRi8LRERdXHTEb
vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a+y+z184UhuZ/oGyMw
eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF
Y+jUu/G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36+NyEK/ts3mPLL
-----END CERTIFICATE-----

U kunt dit certificaat decoderen en bekijken met

deze certificaatdecoderof een andere certificaatdecoder


Antwoord 5, autoriteit 3%

SSL-certificaat omzeilen….

       HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
        // Pass the handler to httpclient(from you are calling api)
        var client = new HttpClient(clientHandler)

Antwoord 6, autoriteit 2%

Om SSL-certificaatvalidatie in clientconfiguratie uit te schakelen.

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>

Antwoord 7, autoriteit 2%

Deze code werkte voor mij. Ik moest TLS2 toevoegen omdat dat de URL is waarin ik geïnteresseerd ben.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(UserDataUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new
      MediaTypeWithQualityHeaderValue("application/json"));
    Task<string> response = client.GetStringAsync(UserDataUrl);
    response.Wait();
    if (response.Exception != null)
    {
         return null;
    }
    return JsonConvert.DeserializeObject<UserData>(response.Result);
}

Antwoord 8

Oud, maar helpt nog steeds…

Een andere geweldige manier om hetzelfde gedrag te bereiken is via het configuratiebestand(web.config)

<system.net>
    <settings>
      <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />
    </settings>
  </system.net>

OPMERKING: volledig getest op .net.


Antwoord 9

Dit werkt voor .Net Core.
Doe een beroep op uw Soap-klant:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  

Antwoord 10

Als je sockets rechtstreeks gebruikt en je authenticeert als de client, dan zal de Service Point Manager callback-methode niet werken. Dit is wat voor mij werkte. ALLEEN GEBRUIKEN VOOR TESTDOELEINDEN.

var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; });
await activeStream.AuthenticateAsClientAsync("computer.local");

De sleutel hier is om de externe certificaatvalidatie-callback rechtstreeks in de constructor van de SSL-stream te geven.


Antwoord 11

Om de post van BIGNUM verder uit te breiden: in het ideale geval wilt u een oplossing die de omstandigheden simuleert die u in productie zult zien en het wijzigen van uw code zal dat niet doen en kan gevaarlijk zijn als u vergeet de code eruit te halen voordat u deze implementeert .

Je hebt een soort zelfondertekend certificaat nodig. Als je weet wat je doet, kun je het binaire BIGNUM gebruiken, maar zo niet, dan kun je op jacht gaan naar het certificaat. Als je IIS Express gebruikt, heb je er al een, je moet hem alleen nog vinden. Open Firefox of welke browser je maar wilt en ga naar je dev-website. U zou de certificaatinformatie van de URL-balk moeten kunnen bekijken en afhankelijk van uw browser zou u het certificaat naar een bestand moeten kunnen exporteren.

Open vervolgens MMC.exe en voeg de module Certificaat toe. Importeer uw certificaatbestand in het Trusted Root Certificate Authorities-archief en dat is alles wat u nodig heeft. Het is belangrijk om ervoor te zorgen dat het naar die winkel gaat en niet naar een andere winkel zoals ‘Persoonlijk’. Als u niet bekend bent met MMC of certificaten, zijn er talloze websites met informatie over hoe u dit kunt doen.

Je computer als geheel vertrouwt nu impliciet alle certificaten die hij zelf heeft gegenereerd en je hoeft geen code toe te voegen om dit speciaal af te handelen. Wanneer u naar productie gaat, blijft het werken op voorwaarde dat u daar een geldig geldig certificaat hebt geïnstalleerd. Doe dit niet op een productieserver – dat zou slecht zijn en het zal niet werken voor andere clients dan die op de server zelf.

Other episodes