78 votes

Le certificat distant n'est pas valide selon la procédure de validation.

En exécutant le code suivant, j'obtiens une exception :

using (var client = new Pop3Client())
{
    client.Connect(provider.ServerWithoutPort, provider.Port, true);
}

L'exception que je reçois :

The remote certificate is invalid according to the validation procedure.

   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost)
   at OpenPop.Pop3.Pop3Client.Connect(String hostname, Int32 port, Boolean useSsl, Int32 receiveTimeout, Int32 sendTimeout, RemoteCertificateValidationCallback certificateValidator)
   at OpenPop.Pop3.Pop3Client.Connect(String hostname, Int32 port, Boolean useSsl)
   at Ugi.Server.Sources.Logic.SourcesService.IsValidPop3Connection(String email, String emailPassword) in C:\Users\elad\Documents\Visual Studio 2010\Projects\SVN\UGI\Ugi\Server\Sources\Logic\SourcesService.cs:line 246

5 votes

@BoPersson sauf que cette autre question a une horrible réponse acceptée et votée.

94voto

Anders Abel Points 36203

Cela se produit généralement parce que l'une des deux situations suivantes est vraie :

  • Le certificat est auto-signé et n'est pas ajouté comme certificat de confiance.
  • Le certificat est expiré.
  • Le certificat est signé par un certificat racine qui n'est pas installé sur votre machine.
  • Le certificat est signé en utilisant l'adresse de domaine entièrement qualifiée du serveur. Autrement dit, vous ne pouvez pas utiliser "xyzServerName", mais vous devez utiliser "xyzServerName.ad.state.fl.us", car il s'agit du nom du serveur pour le certificat SSL.
  • Une liste de révocation est sondée, mais ne peut être trouvée/utilisée.
  • Le certificat est signé via un certificat intermédiaire de l'autorité de certification et le serveur ne sert pas ce certificat intermédiaire avec le certificat de l'hôte.

Essayez d'obtenir des informations sur le certificat du serveur et voyez si vous devez installer des certificats spécifiques sur votre client pour que cela fonctionne.

2 votes

Nous y revenons sans cesse. Certificat racine, à chaque fois. Merci beaucoup ! :D

7 votes

Bon sang de bonsoir... Je suis de nouveau ici, et cette fois-ci, ce n'est aucun des points ci-dessus :/

0 votes

@Squazz : avez-vous résolu le problème ? avez-vous de nouveaux points à ajouter ?

72voto

brimble2010 Points 3781

Version encore plus courte de la solution de Dominic Zukiewicz :

ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true;

Mais cela signifie que vous ferez confiance à tous les certificats. Pour un service qui n'est pas seulement exécuté localement, quelque chose d'un peu plus intelligent sera nécessaire. Dans un premier temps, vous pouvez utiliser ce code pour tester s'il résout votre problème.

4 votes

Voir cette réponse pour savoir pourquoi vous ne devriez le faire que dans de rares cas : stackoverflow.com/a/6613434/1955317

8 votes

Semble plutôt évident à NE PAS utiliser en production. Mais pour avancer dans le développement, c'est une aubaine.

0 votes

@BozoJoe a dit d'une autre manière, "ne faites cela que si c'est un projet scolaire", sinon je ne peux pas imaginer que cela ait sa place.

30voto

Dominic Zukiewicz Points 3207

.NET voit un certificat SSL invalide à l'autre bout de la connexion. Il existe une solution de contournement, mais elle n'est évidemment pas recommandée pour le code de production :

// Put this somewhere that is only once - like an initialization method
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateCertificate);
...

static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
   return true;
}

1 votes

Je suis invité deux fois à le faire. Une fois lors de la connexion et une fois lors du téléchargement du fichier. Est-ce normal ? J'ai inséré le code selon vos instructions. Une fois à l'initialisation et une fois dans ma classe FTP.

0 votes

Hourra ServicePointManager à la rescousse du développement

1 votes

Cette approche vous offre également d'autres options pour inspecter le certificat X509 avant de décider de (toujours) renvoyer le certificat X509. true

28voto

stackunderflow Points 794

J'ai eu le même problème alors que je testais un projet et il s'est avéré que l'exécution de Fiddler était à l'origine de cette erreur !

Si vous utilisez Fiddler pour intercepter la requête http, fermez-le ...

C'est l'une des nombreuses causes de cette erreur.

Pour réparer Fiddler, vous devrez peut-être Réinitialiser les certificats Https de Fiddler .

0 votes

Le lien vers la réinitialisation des certificats Https de Fiddler a fonctionné pour moi, merci.

1 votes

Vous, mon ami, êtes un champion :) une solution simple et rapide à un problème qui aurait pu être insurmontable !

1voto

Saeid Points 27

Vous devez vérifier le code de hachage du certificat.

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain,
    errors) =>
        {
            var hashString = certificate.GetCertHashString();
            if (hashString != null)
            {
                var certHashString = hashString.ToLower();
                return certHashString == "dec2b525ddeemma8ccfaa8df174455d6e38248c5";
            }
            return false;
        };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X