"Le certificat distant n'est pas valide selon la procédure de validation." en utilisant le serveur SMTP Gmail


222

Je reçois cette erreur:

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

chaque fois que j'essaie d'envoyer des e-mails à l'aide du serveur SMTP de Gmail dans mon code C #. Quelqu'un peut-il m'orienter dans la bonne direction pour trouver une solution à ce problème?

Ce qui suit est la trace de la pile ...

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.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at BulkEmail.frmemail.mailsending(String toaddress, String fromaddress, String fromname, String subject, String pwd, String attachements, String mailmessage, String htmlmessage, Int32 i, Int32 j, String replytoaddress)

1
Pouvez-vous nous en dire plus sur votre configuration d'utilisation des serveurs SMTP Gmail? Ma chance: pouvez-vous nous en dire plus sur vos politiques de sécurité pour SSL (comme utiliser un certificat SSL valide / invalide?).
Brian Clozel

Pouvez-vous nous donner un exemple de code où vous pouvez reproduire l'erreur?
zaTricky

Réponses:


302

Avertissement: ne l'utilisez pas dans le code de production!

Pour contourner ce problème, vous pouvez désactiver la validation de certificat. Ne faites cela que pour obtenir la confirmation que l'erreur est lancée en raison d'un mauvais certificat.

Appelez cette méthode avant d'appeler smtpclient.Send():

    [Obsolete("Do not use this in Production code!!!",true)]
    static void NEVER_EAT_POISON_Disable_CertificateValidation()
    {
        // Disabling certificate validation can expose you to a man-in-the-middle attack
        // which may allow your encrypted message to be read by an attacker
        // https://stackoverflow.com/a/14907718/740639
        ServicePointManager.ServerCertificateValidationCallback =
            delegate (
                object s,
                X509Certificate certificate,
                X509Chain chain,
                SslPolicyErrors sslPolicyErrors
            ) {
                return true;
            };
    }

175
C'est un hack, pas une solution?
LB.

88
J'adorerais voir une solution, plutôt que de désactiver complètement toute sécurité.
Roman Starkov

71
comme solution de contournement à un problème de sécurité, vous pouvez désactiver la sécurité? WTF?
John Nicholas

68
J'ai dû déprécier cela, car les gens semblent toujours penser que c'est une solution. Il suffit de désactiver la sécurité. NE PAS UTILISER DANS LA PRODUCTION , les gens. Il le dit même. Sheesh.
MGOwen

51
A voté. Je suis entièrement d'accord que cela ne devrait pas être utilisé dans la production MAIS .. Je fais un prototype de quelque chose. Le serveur de test qu'ils m'ont fourni me force à utiliser SSL. Travailler avec des certificats est assez nouveau pour moi, donc je veux juste un moyen rapide , ce qui est parfait car je ne vais pas l'
utiliser en production

58

Le lien ici a résolu mon problème.

http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html

Je suis allé à l'URL du service Web (sur le serveur qui avait le problème), j'ai cliqué sur la petite icône de sécurité dans IE, qui a fait apparaître le certificat. J'ai ensuite cliqué sur l'onglet Détails, cliqué sur le bouton Copier dans un fichier, ce qui m'a permis d'exporter le certificat sous forme de fichier .cer. Une fois que j'ai eu le certificat localement, j'ai pu l'importer dans le magasin de certificats sur le serveur en utilisant les instructions ci-dessous.

Démarrez une nouvelle console MMC. Fichier -> Ajouter / Supprimer un composant logiciel enfichable ... Cliquez sur Ajouter ... Choisissez Certificats et cliquez sur Ajouter. Cochez la case d'option "Compte d'ordinateur". Cliquez sur Suivant.

Choisissez l'ordinateur client dans l'écran suivant. Cliquez sur Terminer. Cliquez sur Fermer. Cliquez sur OK. Installez MAINTENANT le certificat dans le magasin de certificats des autorités de certification racines de confiance. Cela permettra à tous les utilisateurs de faire confiance au certificat.


+1 lors de l'importation d'un certificat via l'outil d'importation sur le certificat et non via le composant logiciel enfichable, c'est uniquement pour votre compte d'utilisateur. L'utilisation du composant logiciel enfichable vous permet de choisir à qui est destinée l'importation, le compte d'utilisateur, le compte de service ou tout le monde. Merci pour votre pointeur. J'étais en train de me gratter la tête pendant une minute ou deux!
davidb

Si vous souhaitez utiliser la ligne de commande pour automatiser tous les postes de travail dev / test - certutil -f -p test -importPFX Root devcert.pfxet certutil -f -p test -importPFX MY devcert.pfx. Doit être exécuté dans une invite de commande d'administration (en supposant que le mot de passe PFX est test)
DeepSpace101

C'est le meilleur moyen de le réparer si vous utilisez un certificat auto-signé pour les tests, merci T-Rex!
ToastyMallows

36

Vous pouvez améliorer le code en demandant à l'utilisateur lorsque le certificat n'est pas valide s'il souhaite continuer ou non. Voulez-vous continuer? Comme ci-dessous:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Et ajoutez une méthode comme celle-ci:

public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;
    else
    {
        if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            return true;
        else
            return false;
    }
}

50
Qui cliquera sur le bouton "Continuer", s'il s'agit d'une application cloud?
Konstantin Isaev

34

Un peu tard pour la fête, mais si vous cherchez une solution comme celle de Yury, le code suivant vous aidera à identifier si le problème est lié à un certificat d'auto-signature et, si tel est le cas, ignorez l'erreur d'auto-signature. Vous pouvez évidemment rechercher d'autres erreurs SSL si vous le souhaitez.

Le code que nous utilisons (avec l'aimable autorisation de Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) est le suivant:

  private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
  // If the certificate is a valid, signed certificate, return true.
  if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
  {
    return true;
  }

  // If there are errors in the certificate chain, look at each error to determine the cause.
  if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
  {
    if (chain != null && chain.ChainStatus != null)
    {
      foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
      {
        if ((certificate.Subject == certificate.Issuer) &&
           (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
        {
          // Self-signed certificates with an untrusted root are valid. 
          continue;
        }
        else
        {
          if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
          {
            // If there are any other errors in the certificate chain, the certificate is invalid,
         // so the method returns false.
            return false;
          }
        }
      }
    }

    // When processing reaches this line, the only errors in the certificate chain are 
// untrusted root errors for self-signed certificates. These certificates are valid
// for default Exchange server installations, so return true.
    return true;
  }
  else
  {
 // In all other cases, return false.
    return false;
  }
}

1
Pour mon cas, sslPolicyErrors était RemoteCertificateNameMismatch et j'ai modifié la vérification du certificat parce que nous n'avions pas les mêmes valeurs Subject et Issuer.
Ufuk Hacıoğulları

2
Le certificat X509 utilisé par le serveur Exchange a continué de basculer entre un certificat auto-signé et un certificat approuvé. L'utilisation de ce code a aidé mon administrateur réseau et moi non seulement à comprendre que c'était le cas, mais également à résoudre le problème en contournant uniquement les certificats auto-signés. C'était parfait!
Bret

20

J'ai eu exactement le même problème et j'ai compris que par défaut l' antivirus Mail Shield d'Avast avait la "Scan SSL connection" activée. Assurez-vous de désactiver cela .

D'après mes connaissances, Avast "ouvrira" le courrier, le recherchera pour détecter tout virus, puis le signera en utilisant son propre certificat afin que le courrier ne soit plus signé par le certificat de gmail qui produit cette erreur.

Solution 1:

  • Désactivez les analyses SSL de votre antivirus (ou de l'ensemble du bouclier de messagerie).

Solution 2 (devrait être la meilleure solution de sécurité):

  • Obtenez en quelque sorte le certificat utilisé par l'antivirus (Avast a une option pour l'exporter)
  • Importez-le dans votre client imap / pop / smtp avant de vous connecter au serveur gmail.

1
Tu m'as fait gagner beaucoup de temps. Il aurait fallu une éternité pour comprendre que mon antivirus serait à blâmer et non mon code.
arao6

13

Obtenez la même erreur lors de l'envoi à partir d'Outlook en raison de SSL. Le paramètre essayé EnableSSL = false a résolu le problème.

exemple:

var smtp = new SmtpClient
                {
                    Host = "smtp.gmail.com",                   
                    Port = 587,
                    EnableSsl = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    UseDefaultCredentials = false,                   
                    Credentials = new NetworkCredential("xxx@gmail.com", "xxxxx")
                };

3
gmail ne vous permettra pas de vous connecter pendant que vous définissez SSL sur faux, j'ai essayé votre solution, cela n'a pas fonctionné pour moi.
Zeeshan Ajmal

Ouais, c'est ce que j'appelle "basique" (vs "aucun" ou "ssl") ....... ces paramètres de messagerie sont parfois délicats.
granadaCoder

9

Êtes-vous sûr d'utiliser la bonne adresse de serveur SMTP?

Smtp.google.com et smtp.gmail.com fonctionnent tous les deux, mais un certificat SSL est émis pour le second.


9

J'ai eu la même erreur lorsque j'ai essayé d'envoyer des e-mails SmtpClientvia un serveur proxy (Usergate).

Vérifie que le certificat contenait l'adresse du serveur, qui n'est pas égale à l'adresse du serveur proxy, d'où l'erreur. Ma solution: lorsqu'une erreur survient lors de la vérification du certificat, recevez le certificat, exportez-le et vérifiez.

public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        // if got an cert auth error
        if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
        const string sertFileName = "smpthost.cer";

        // check if cert file exists
        if (File.Exists(sertFileName))
        {
            var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
            return certificate.Equals(actualCertificate);
        }

        // export and check if cert not exists
        using (var file = File.Create(sertFileName))
        {
            var cert = certificate.Export(X509ContentType.Cert);
            file.Write(cert, 0, cert.Length);
        }
        var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(createdCertificate);
    }

Code complet de ma classe d'expéditeur d'email:

public class EmailSender
{
    private readonly SmtpClient _smtpServer;
    private readonly MailAddress _fromAddress;

    public EmailSender()
    {
        ServicePointManager.ServerCertificateValidationCallback = RemoteServerCertificateValidationCallback;
        _smtpServer = new SmtpClient();
    }

    public EmailSender(string smtpHost, int smtpPort, bool enableSsl, string userName, string password, string fromEmail, string fromName) : this()
    {
        _smtpServer.Host = smtpHost;
        _smtpServer.Port = smtpPort;
        _smtpServer.UseDefaultCredentials = false;
        _smtpServer.EnableSsl = enableSsl;
        _smtpServer.Credentials = new NetworkCredential(userName, password);

        _fromAddress = new MailAddress(fromEmail, fromName);
    }

    public bool Send(string address, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        return Send(new List<MailAddress> { new MailAddress(address) }, mailSubject, htmlMessageBody, fileName);
    }

    public bool Send(List<MailAddress> addressList, string mailSubject, string htmlMessageBody,
        string fileName = null)
    {
        var mailMessage = new MailMessage();
        try
        {
            if (_fromAddress != null)
                mailMessage.From = _fromAddress;

            foreach (var addr in addressList)
                mailMessage.To.Add(addr);

            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.Subject = mailSubject;

            mailMessage.Body = htmlMessageBody;
            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.IsBodyHtml = true;

            if ((fileName != null) && (System.IO.File.Exists(fileName)))
            {
                var attach = new Attachment(fileName, MediaTypeNames.Application.Octet);
                attach.ContentDisposition.CreationDate = System.IO.File.GetCreationTime(fileName);
                attach.ContentDisposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
                attach.ContentDisposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
                mailMessage.Attachments.Add(attach);
            }
            _smtpServer.Send(mailMessage);
        }
        catch (Exception e)
        {
            // TODO lor error
            return false;
        }
        return true;
    }

    public static bool RemoteServerCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    // if got an cert auth error
    if (sslPolicyErrors != SslPolicyErrors.RemoteCertificateNameMismatch) return false;
    const string sertFileName = "smpthost.cer";

    // check if cert file exists
    if (File.Exists(sertFileName))
    {
        var actualCertificate = X509Certificate.CreateFromCertFile(sertFileName);
        return certificate.Equals(actualCertificate);
    }

    // export and check if cert not exists
    using (var file = File.Create(sertFileName))
    {
        var cert = certificate.Export(X509ContentType.Cert);
        file.Write(cert, 0, cert.Length);
    }
    var createdCertificate = X509Certificate.CreateFromCertFile(sertFileName);
    return certificate.Equals(createdCertificate);
}

}


7

Je sais que je suis assez tard dans ce jeu, mais je n'ai pas vu de réponse pointant ici vers les journaux system.diagnostics pour le flux TLS.

Avant d’apporter des modifications à votre code, assurez-vous de bien comprendre le problème. Le AuthenticationExceptionfait partie de cette exception très générique qui ne dit pas grand-chose. Pour savoir ce qui se passe sous le capot, modifiez le fichier app.config de votre application (ou créez-en un nouveau) et assurez-vous que la source de trace System.Net est activée dans la system.diagnosticssection, par exemple:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" />
    <sharedListeners>
      <add name="file" initializeData="c:\network.log" type="System.Diagnostics.TextWriterTraceListener" />
    </sharedListeners>
    <sources>
      <source name="System.Net" switchValue="Verbose">
        <listeners>
          <add name="file" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Relancez votre application et vérifiez le fichier c: \ network.log. Vous devriez y voir des informations détaillées sur votre connexion TLS (SSL), par exemple:

System.Net Information: 0 : [12764] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = f44368:535f958, targetName = localhost, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [12764] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [12764] Remote certificate: [Version]
  V3

[Subject]
  CN=test
  Simple Name: test
  DNS Name: example.com

[Issuer]
  CN=Root CA
  Simple Name: Root CA
  DNS Name: Root CA

...

[Signature Algorithm]
  sha256RSA(1.2.840.113549.1.1.11)

[Public Key]
  Algorithm: RSA
  Length: 2048
  Key Blob: ....
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate has errors:
System.Net Information: 0 : [12764] SecureChannel#38496415 -    Certificate name mismatch.
System.Net Information: 0 : [12764] SecureChannel#38496415 - Remote certificate was verified as invalid by the user.
System.Net Error: 0 : [12764] Exception in AppDomain#10923418::UnhandledExceptionHandler - The remote certificate is invalid according to the validation procedure..

Sachant ce qui cause le problème, vous devriez pouvoir le résoudre ou au moins affiner vos recherches Google.


6

Mon problème était sur Windows 2003 Server, lors de l'appel d'AuthenticateAsClient. Les solutions ci-dessus (par exemple contourner ServicePointManager.ServerCertificateValidationCallback) n'ont pas fonctionné.

Il s'avère que c'est un bogue dans Windows 2003, et il y a un correctif:

"Les applications qui utilisent l'API de cryptographie ne peuvent pas valider un certificat X.509 dans Windows Server 2003"

https://support.microsoft.com/en-us/kb/938397

L'installation de ce correctif a résolu mon problème.


5

Mon problème n'était pas que je référençais le serveur par l'adresse IP au lieu de l'URL. J'avais acheté un certificat signé auprès d'une autorité de certification pour l'utiliser dans un réseau privé. L'URL spécifiée sur le certificat importe lors du référencement du serveur. Une fois que j'ai référencé le serveur par l'URL dans le certificat, tout a commencé à fonctionner.


Cette réponse mérite d'être supérieure, car elle signale une erreur courante; les gens (y compris moi-même) pensent que le but de Host est uniquement de trouver le serveur.
Mojtaba

4

Le dossier de votre site Web a besoin de la sécurité du service réseau. Surtout le web.config. Il utilise ce compte pour accéder à votre registre pour les certificats. Cela arrêtera le besoin d'ajouter un hack à votre code.


4

Vérifiez la date et l'heure de votre ordinateur. Si elle est incorrecte, mettez-la à jour à l'heure actuelle ou réglez-la automatiquement pour obtenir l'heure sur Internet.

Étant donné que les certificats sont liés à une période de temps fixe, si votre horloge est incorrecte, vous risquez d'obtenir des erreurs comme celle-ci. Dans ce scénario, en fixant l'heure, le problème sera résolu.


1
Si la date de votre système est "trop ​​éloignée" de l'heure actuelle, la validité du certificat reçu de Google pose problème. Il voit émis sur et valide pour les informations qui n'ont pas beaucoup de temps actuel. Ce n'est pas la seule chose qui ne peut pas causer ce problème. Mais c'est certainement celui qui le peut.
phil soady

1
Un rappel extrêmement utile pour vérifier cela dans mon cas! Le rasoir d'Occam et tout ça ... :) Maintenant à propos de cette batterie CMOS ...
Mike G


2

Dans notre cas, le problème a été causé par le certificat du serveur IIS. Le sujet du certificat a été défini sur le nom DNS et les utilisateurs tentaient d'accéder au site Web par adresse IP, la validation de la certification .NET a donc échoué. Le problème a disparu lorsque les utilisateurs ont commencé à utiliser le nom DNS.

Vous devez donc modifier l'URL de votre fournisseur en https: //CertificateSubject/xxx/xxx.application


Pouvez-vous élaborer cela? Dans mon cas, l'application fonctionne sur un serveur et ne fonctionne pas sur l'autre. Je ne sais rien ... Je ne suis pas un expert, mais le domaine est toujours connecté à celui qui fonctionne, et le certificat de serveur est déjà installé sur les deux machines. Je ne comprends toujours pas pourquoi cela pourrait être pertinent car il dit "certificat à distance".
Michael Brennt


1

L'ajout de cette ligne a fonctionné pour moi. En fait, cela fait confiance à tous les certificats comme mentionné ici . Cependant, cela peut être utilisé principalement pour le dépannage. Si cela fonctionne pour vous, cela signifie que le certificat du serveur distant n'est pas ajouté en tant que certificat approuvé sur votre ordinateur.

System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);

Le code complet est

private void sendAMail(String toAddress, String messageBody)
        {
            String msg = "Sending mail to : " + toAddress;

            MailMessage mail = new MailMessage();
            mail.To.Add(toAddress);
            mail.From = new MailAddress("from@mydomain.com");
            mail.Subject = "Subject: Test Mail";
            mail.Body = messageBody;
            mail.IsBodyHtml = true;            

            //Added this line here
            System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(RemoteServerCertificateValidationCallback);
            SmtpClient smtp = new SmtpClient();

            smtp.Host = "myhostname.com";            
            smtp.Credentials = new System.Net.NetworkCredential("sender@sample.com", "");
            smtp.EnableSsl = true;
            smtp.Port = 587;            
            smtp.Send(mail);            
        }


private bool RemoteServerCertificateValidationCallback(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    //Console.WriteLine(certificate);
    return true;
}

0

Cela a résolu mon problème

smtpClient.Credentials = new NetworkCredential(sendMail.UserName, sendMail.Password);
smtpClient.EnableSsl = false;//sendMail.EnableSSL;

// Avec référence à // Le problème vient uniquement Utilisez la ligne ci-dessus pour définir un faux SSl afin de résoudre l'erreur lorsque le nom d'utilisateur et le mot de passe sont entrés dans les paramètres SMTP.


13
Cela désactive également la sécurité.
Zoey du

0

voici la solution que j'ai décidé d'utiliser.

        ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            string name = certificate.Subject;

            DateTime expirationDate = DateTime.Parse(certificate.GetExpirationDateString());

            if (sslPolicyErrors == SslPolicyErrors.None || (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch && name.EndsWith(".acceptabledomain.com") && expirationDate > DateTime.Now))
            {
                return true;
            }
            return false;
        };

0

Le code de la réponse acceptée m'a aidé à déboguer le problème. J'ai alors réalisé que le champ SN de l' certificateargument n'était pas le même que ce que je pensais être mon serveur SMTP. En définissant la Hostpropriété de l'instance SmtpClient sur la valeur SN du certificat, j'ai pu résoudre le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.