"Il certificato remoto non è valido secondo la procedura di convalida." utilizzando il server SMTP di Gmail


222

Ricevo questo errore:

Il certificato remoto non è valido secondo la procedura di convalida.

ogni volta che provo a inviare e-mail utilizzando il server SMTP di Gmail nel mio codice C #. Qualcuno può indicarmi la giusta direzione per una soluzione a questo problema?

Di seguito è riportata la traccia dello stack ...

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
Puoi dirci di più sulla tua configurazione per l'utilizzo dei server SMTP di Gmail? La mia ipotesi fortunata: puoi dirci di più sulle tue politiche di sicurezza per SSL (come usare un certificato SSL valido / non valido?).
Brian Clozel,

Puoi darci un esempio di codice in cui è possibile riprodurre l'errore?
zaTricky,

Risposte:


302

Avvertenza: non utilizzarlo nel codice di produzione!

Per ovviare al problema, è possibile disattivare la convalida del certificato. Fallo sempre e solo per ottenere la conferma che l'errore è stato generato a causa di un certificato non valido.

Chiama questo metodo prima di chiamare 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;
            };
    }

174
Questo è un trucco, non una correzione?
LB.

88
Mi piacerebbe vedere una soluzione, piuttosto che disattivare completamente la sicurezza.
Roman Starkov,

71
come soluzione alternativa a un problema di sicurezza è possibile disattivare la sicurezza? WTF?
John Nicholas,

68
Ho dovuto sottovalutare questo, poiché la gente sembra ancora pensare che sia una soluzione. È SOLO SPEGNERE LA SICUREZZA. NON USARE IN PRODUZIONE , persone. Lo dice persino. Sheesh.
MGOwen

51
Upvoted. Sono pienamente d'accordo che questo non dovrebbe essere usato nella produzione MA .. Sto realizzando un prototipo di qualcosa. Il server di test che mi hanno fornito mi impone di utilizzare SSL. Lavorare con i certificati è abbastanza nuovo per me, quindi voglio solo un QUICK WAY OUT , il che è perfetto poiché non lo
userò in produzione

58

Il link qui ha risolto il mio problema.

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

Sono andato a url del servizio web (sul server che ha avuto il problema), ho fatto clic sulla piccola icona di sicurezza in IE, che ha portato il certificato. Ho quindi fatto clic sulla scheda Dettagli, ho fatto clic sul pulsante Copia su file, che mi ha permesso di esportare il certificato come file .cer. Una volta ottenuto il certificato localmente, sono stato in grado di importarlo nell'archivio certificati sul server utilizzando le istruzioni seguenti.

Avvia un nuovo MMC. File -> Aggiungi / Rimuovi snap-in ... Fai clic su Aggiungi ... Scegli certificati e fai clic su Aggiungi. Controllare il pulsante di opzione "Account computer". Fai clic su Avanti.

Scegli il computer client nella schermata successiva. Fai clic su Fine. Clicca Chiudi. Clicca OK. ORA installare il certificato nell'archivio certificati delle autorità di certificazione radice attendibili. Ciò consentirà a tutti gli utenti di fidarsi del certificato.


+1 quando si importa un certificato tramite lo strumento di importazione nel certificato e non tramite lo snap-in, è solo per il proprio account utente. L'utilizzo dello snap-in consente di scegliere a chi assegnare l'importazione, l'account utente, l'account del servizio o tutti. Grazie per il tuo puntatore. Mi stavo grattando la testa per un minuto o due lì!
davidb,

Se si desidera utilizzare la riga di comando per automatizzare tutte le workstation di sviluppo / test - certutil -f -p test -importPFX Root devcert.pfxe certutil -f -p test -importPFX MY devcert.pfx. Deve essere eseguito nel prompt dei comandi di amministrazione (supponendo che la password PFX sia test)
DeepSpace101

Questo è il modo migliore per risolverlo se si utilizza un certificato autofirmato per i test, grazie a T-Rex!
ToastyMallows

36

È possibile migliorare il codice chiedendo all'utente quando il certificato non è valido se desidera continuare o meno. Vuoi continuare? Come sotto:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

E aggiungi un metodo come questo:

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
Chi farà clic sul pulsante "Continua", se si tratta di un'app cloud?
Konstantin Isaev,

34

Un po 'in ritardo per la festa, ma se stai cercando una soluzione come quella di Yury, il seguente codice ti aiuterà a identificare se il problema è legato a un certificato di auto-firma e, in tal caso, ignora l'errore di auto-firma. Ovviamente potresti verificare altri errori SSL se lo desideri.

Il codice che utilizziamo (per gentile concessione di Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) è il seguente:

  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
Nel mio caso sslPolicyErrors era RemoteCertificateNameMismatch e ho modificato il controllo del certificato perché non avevamo gli stessi valori di Soggetto ed Emittente.
Ufuk Hacıoğulları,

2
Il certificato X509 utilizzato dal server Exchange ha continuato a passare da uno autofirmato a uno affidabile. L'utilizzo di questo codice ha aiutato il mio amministratore di rete e non solo a capire che era così, ma ha anche risolto il problema ignorando solo i certificati autofirmati. Questo è stato perfetto!
Bret,

20

Ho avuto lo stesso identico problema e ho capito che per impostazione predefinita Mail Shield di Avast aveva attivato la "Scansione connessione SSL" . Assicurati di disattivarlo .

Per quanto ne so , Avast "aprirà" la posta, la scansionerà alla ricerca di eventuali virus e quindi la firmerà utilizzando il proprio certificato in modo che la posta non venga più firmata dal certificato di Gmail che produce quell'errore.

Soluzione 1:

  • Disattiva le scansioni SSL dal tuo antivirus (o dall'intero scudo di posta).

Soluzione 2 (dovrebbe essere la migliore sicurezza parlando):

  • Ottieni in qualche modo il certificato utilizzato dall'antivirus (Avast ha un'opzione per esportarlo)
  • Importalo nel tuo client imap / pop / smtp prima di connetterti al server Gmail.

1
Mi hai risparmiato così tanto tempo. Ci sarebbe voluta un'eternità per capire che il mio antivirus sarebbe la colpa e non il mio codice.
arao6,

13

Ottieni lo stesso errore durante l'invio da Outlook a causa di SSL. Ho provato l'impostazione EnableSSL = false ha risolto il problema.

esempio:

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 non ti consentirà di collegarti mentre imposti SSL su false, ho provato la tua soluzione che non ha funzionato per me.
Zeeshan Ajmal,

Sì, questo è ciò che chiamo "base" (vs "nessuno" o "ssl") ....... quelle impostazioni di posta elettronica a volte sono difficili.
granadaCoder

9

Sei sicuro di utilizzare l'indirizzo del server SMTP corretto?

Sia smtp.google.com che smtp.gmail.com funzionano, ma il certificato SSL viene rilasciato al secondo.


9

Ho avuto lo stesso errore quando ho provato a inviare e-mail utilizzando SmtpClienttramite server proxy (Usergate).

Verifica che il certificato contenga l'indirizzo del server, che non è uguale all'indirizzo del server proxy, quindi l'errore. La mia soluzione: quando si verifica un errore durante il controllo del certificato, ricevi il certificato, esportalo e verifica.

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

Codice completo della mia classe mittente e-mail:

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

So di essere abbastanza in ritardo in questo gioco, ma non ho visto una risposta qui che punta ai log di system.diagnostics per TLS Stream.

Prima di apportare modifiche al codice, assicurati di comprendere il problema. Questa AuthenticationExceptionè un'eccezione molto generica che non dice molto. Per sapere cosa sta succedendo, modifica il file app.config per la tua applicazione (o creane uno nuovo) e assicurati di avere origine traccia System.Net abilitata nella system.diagnosticssezione, ad esempio:

<?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>

Eseguire nuovamente l'applicazione e controllare il file c: \ network.log. Dovresti vedere informazioni dettagliate sulla tua connessione TLS (SSL), ad esempio:

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..

Sapendo cosa causa il problema, dovresti essere in grado di risolverlo o almeno restringere le tue ricerche su Google.


6

Il mio problema era su Windows 2003 Server, quando si chiamava AuthenticateAsClient. Le soluzioni sopra (es. Elusione ServicePointManager.ServerCertificateValidationCallback) non hanno funzionato.

Si scopre che si tratta di un bug in Windows 2003 e esiste un aggiornamento rapido:

"Le applicazioni che utilizzano l'API di crittografia non possono convalidare un certificato X.509 in Windows Server 2003"

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

L'installazione di questo aggiornamento rapido ha risolto il mio problema.


4

La cartella del tuo sito Web richiede la sicurezza del servizio di rete. Soprattutto il web.config. Utilizza questo account per accedere al registro per i certificati. Questo fermerà la necessità di aggiungere un hack al tuo codice.


4

Il mio problema non era che stavo facendo riferimento al server tramite l'indirizzo IP anziché l'URL. Avevo acquistato un certificato firmato da un'autorità di certificazione da utilizzare all'interno di una rete privata. L'URL specificato sul certificato è importante quando si fa riferimento al server. Dopo aver fatto riferimento al server tramite l'URL nel certificato, tutto ha iniziato a funzionare.


Questa risposta merita di essere superiore, perché indica un errore comune; le persone (incluso me stesso) pensano che lo scopo di Host sia solo quello di trovare il server.
Mojtaba,

4

Controlla la data e l'ora del tuo computer. Se è sbagliato, aggiornalo all'ora corrente o impostalo automaticamente per ottenere l'ora da Internet.

Poiché i certificati sono legati a un periodo di tempo fisso, se l'orologio è sbagliato, è probabile che si verifichino errori come questo. In quello scenario, fissando il tempo, il problema verrà risolto.


1
Se la data del tuo sistema è "troppo lontana" dall'ora corrente, la validità del certificato ricevuto da Google causa un problema. Vede rilasciato e valido per le informazioni che non molto tempo corrente. Questa non è l'unica cosa che non può causare questo problema. Ma è certamente quello che può.
Phil Soady,

1
Un promemoria estremamente utile per ricontrollare questo nel mio caso! Occam's Razor e tutto il resto ... :) Ora su quella batteria CMOS ...
Mike G,


2

Nel nostro caso il problema è stato causato dal certificato del server IIS. L'oggetto del certificato era impostato sul nome DNS e gli utenti stavano tentando di accedere al sito Web tramite l'indirizzo IP, quindi la convalida della certificazione .NET non è riuscita. Il problema è scomparso quando gli utenti hanno iniziato a utilizzare il nome DNS.

Quindi devi cambiare l'URL del tuo provider in https: //CertificateSubject/xxx/xxx.application


Puoi elaborarlo? Nel mio caso l'app funziona su un server e non funziona sull'altro. Non ho idea ... Non sono un esperto, ma il dominio è ancora collegato a quello funzionante e il certificato del server è già installato su entrambe le macchine. Ancora non capisco perché potrebbe essere comunque rilevante dal momento che dice "certificato remoto".
Michael Brennt,


1

L'aggiunta di questa linea ha funzionato per me. Questo infatti si fida di tutti i certificati come menzionato qui . Tuttavia, questo può essere utilizzato principalmente per la risoluzione dei problemi. Se questo funziona per te, significa che il certificato del server remoto non viene aggiunto come certificato attendibile nella tua macchina.

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

Il codice completo è

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

Ha risolto il mio problema

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

// Con riferimento a // Il problema viene solo Utilizzare la riga sopra per impostare false SSl per risolvere l'errore quando si immettono nome utente e password nelle impostazioni SMTP.


13
Questo sta anche disattivando la sicurezza.
Zoey,

0

ecco la soluzione che ho deciso di utilizzare.

        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

Il codice dalla risposta accettata mi ha aiutato a eseguire il debug del problema. Ho quindi capito che il campo SN certificatedell'argomento non era lo stesso di quello che pensavo fosse il mio server SMTP. Impostando la Hostproprietà dell'istanza SmtpClient sul valore SN del certificato sono stato in grado di risolvere il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.