C # ignorer les erreurs de certificat?

j'obtiens l'erreur suivante lors d'une demande de service web un service web distant:

ne pouvait établir de relation de confiance pour la voie de communication protégée SSL/TLS. ---> Système.Sécurité.Authentication.Authentificationexception: le certificat distant n'est pas valide selon la procédure de validation.

est - il de toute façon d'ignorer cette erreur, et de continuer?

il semble que la télécommande le certificat n'est pas signé.

le site auquel je me connecte est www.czebox.cz - n'hésitez pas à visiter le site, et de noter même les navigateurs jeter des exceptions de sécurité.

127
demandé sur Luke Girvin 2010-04-20 16:42:13

8 réponses

Ajouter un gestionnaire de validation de certificat. Retourner true permettra d'ignorer l'erreur de validation:

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;
283
répondu Peter Lillevold 2010-04-20 12:48:53

Méthode IgnoreBadCertificates:

//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;
} 
26
répondu Amen Ra 2013-03-07 06:17:33

la raison pour laquelle il échoue n'est pas parce qu'il n'est pas signé mais parce que le certificat racine n'est pas fiable par votre client. Plutôt que de désactiver la validation SSL, une autre approche serait d'ajouter le cert de CA racine à la liste des Ca auxquelles votre application fait confiance.

C'est le certificat root que votre application ne fait pas confiance actuellement:

- - - - - BEGIN

- - - - - END CERTIFICATE - - - - -

vous pouvez décoder et visualiser ce certificat en utilisant

ce certificat décodeur ou un autre certificat décodeur

24
répondu bignum 2010-04-20 19:41:57

Autoriser tous les certificats est très puissant, mais il pourrait également être dangereux. Si vous souhaitez n'autoriser que les certificats valides plus certains certificats, cela pourrait être fait comme ceci.

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;
};

mise à jour:

comment obtenir cert.GetCertHashString() valeur dans Chrome:

Cliquez sur Secure ou Not Secure dans la barre d'adresse.

enter image description here

enter image description here

ensuite, cliquez sur le certificat -> Détails -> empreinte du pouce et copiez la valeur. N'oubliez pas de faire cert.GetCertHashString().ToLower() .

enter image description here

21
répondu Ogglas 2018-03-05 10:17:47

pour désactiver la validation ssl cert dans la configuration client.

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>
5
répondu d.marzo 2016-04-13 10:39:22

ce code a fonctionné pour moi. J'ai dû ajouter TLS2 parce que c'est ce que L'URL qui m'intéresse utilisait.

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);
}
3
répondu user2347528 2017-10-09 13:42:13

si vous utilisez des sockets directement et que vous vous authentifiez en tant que client, alors la méthode de rappel Service Point Manager ne fonctionnera pas. Voici ce qui a fonctionné pour moi. PLEASE USE FOR TESTING PURPOSES ONLY .

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

la clé ici, est de fournir le callback de validation de certificat à distance directement dans le constructeur du flux SSL.

2
répondu Mario 2016-05-05 04:32:05

pour développer davantage le post de BIGNUM - Idéalement, vous voulez une solution qui simule les conditions que vous verrez dans la production et modifier votre code ne fera pas cela et pourrait être dangereux si vous oubliez de prendre le code avant de le déployer.

vous aurez besoin d'une sorte de certificat auto-signé. Si vous savez ce que vous faites vous pouvez utiliser le bignum binaire posté, mais si non vous pouvez aller à la chasse pour le certificat. Si vous utilisez IIS Express, vous l'un de ces, vous aurez juste à le trouver. Ouvrez Firefox ou n'importe quel navigateur que vous aimez et allez sur votre site de développement. Vous devriez être en mesure de voir les renseignements du certificat à partir de la barre D'URL et selon votre navigateur, vous devriez être en mesure d'exporter le certificat à un fichier.

suivant, ouvrez MMC.exe, et ajouter le composant logiciel enfichable Certificats. Importez votre fichier de certificat dans la boutique Trusted Root Certificate Authorities et c'est tout ce dont vous avez besoin. Il est important de assurez-vous qu'il va dans ce magasin et pas un autre comme "personnel". Si vous n'êtes pas familier avec MMC ou certificats, il existe de nombreux sites Web avec des informations sur la façon de le faire.

maintenant, votre ordinateur dans son ensemble fera implicitement confiance à tous les certificats qu'il a générés lui-même et vous n'aurez pas besoin d'ajouter du code pour gérer cela spécialement. Lorsque vous passez à la production il continuera à fonctionner à condition que vous avez un certificat valide approprié installé là. Ne le fais pas sur un serveur de production - ce serait mauvais et il ne fonctionnera pas pour d'autres clients que ceux sur le serveur lui-même.

1
répondu Nigel Thomas 2016-04-12 02:24:22