"O certificado remoto é inválido de acordo com o procedimento de validação." usando o servidor SMTP do Gmail

222

Estou recebendo este erro:

O certificado remoto é inválido de acordo com o procedimento de validação.

sempre que tento enviar email usando o servidor SMTP do Gmail no meu código C #. Alguém pode me indicar a direção certa para uma solução para esse problema?

A seguir, o rastreamento de pilha ...

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)
Josh
fonte
1
Você pode nos contar mais sobre sua configuração para usar servidores SMTP do Gmail? Meu palpite de sorte: Você pode nos contar mais sobre suas políticas de segurança para SSL (como usar um certificado SSL válido / inválido?).
Brian Clozel
Você pode nos dar um exemplo de código onde você pode reproduzir o erro?
ZaTricky

Respostas:

302

Aviso: Não use isso no código de produção!

Como solução alternativa, você pode desativar a validação de certificado. Faça isso apenas para obter a confirmação de que o erro está sendo gerado devido a um certificado inválido.

Chame este método antes de chamar 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;
            };
    }
Yury Skaletskiy
fonte
174
Isso é um hack, não uma correção?
LB.
88
Gostaria de ver uma correção, em vez de desativar completamente toda a segurança.
Roman Starkov
71
Como solução alternativa para um problema de segurança, você pode desativar a segurança? WTF?
John Nicholas
68
Tive que rebaixar isso, pois as pessoas ainda parecem pensar que é uma solução. É APENAS DESLIGAR A SEGURANÇA. NÃO USE NA PRODUÇÃO , pessoal. Ele até diz isso. Sheesh.
MGOwen
51
Votado. Concordo plenamente que isso não deve ser usado na produção, MAS .. Estou fazendo um protótipo de algo. O servidor de teste que eles me forneceram me obriga a usar SSL. Trabalhar com certificados é muito novo para mim, então eu só quero uma maneira rápida de sair , o que é bom, já que eu não
vou usá
58

O link aqui resolveu meu problema.

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

Fui ao URL do serviço web (no servidor que apresentava o problema), cliquei no pequeno ícone de segurança no IE, que exibia o certificado. Em seguida, cliquei na guia Detalhes, clique no botão Copiar para arquivo, o que me permitiu exportar o certificado como um arquivo .cer. Depois de obter o certificado localmente, pude importá-lo para o armazenamento de certificados no servidor usando as instruções abaixo.

Inicie um novo MMC. Arquivo -> Adicionar / Remover Snap-In ... Clique em Adicionar ... Escolha Certificados e clique em Adicionar. Marque o botão de opção "Conta do computador". Clique em Next.

Escolha o computador cliente na próxima tela. Clique em Finish. Clique em Fechar. Clique OK. AGORA instale o certificado no armazenamento de certificados das Autoridades de Certificação Raiz Confiáveis. Isso permitirá que todos os usuários confiem no certificado.

T-Rex
fonte
+1 ao importar um certificado por meio da ferramenta de importação no certificado e não pelo snap-in, é apenas para sua conta de usuário. O uso do snap-in permite escolher para quem é a importação, conta de usuário, conta de serviço ou todos. Obrigado pelo seu ponteiro. Eu estava coçando minha cabeça por um minuto ou dois lá!
Davidb
Se você deseja usar a linha de comando para automatizar todas as estações de trabalho de desenvolvimento / teste - certutil -f -p test -importPFX Root devcert.pfxe certutil -f -p test -importPFX MY devcert.pfx. Precisa ser executado em um comando de administração rápida (assumindo que a senha PFX é test)
DeepSpace101
Essa é a melhor maneira de corrigi-lo se você estiver usando um certificado autoassinado para teste, graças ao T-Rex!
ToastyMallows
36

Você pode melhorar o código perguntando ao usuário quando o certificado não é válido se ele deseja continuar ou não. Você quer continuar? Como abaixo:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

E adicione um método como este:

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;
    }
}
LinuxLover
fonte
50
Quem clicará no botão "Continuar", se for um aplicativo em nuvem?
Konstantin Isaev
34

Um pouco atrasado para a parte, mas se você estiver procurando por uma solução como a Yury, o código a seguir ajudará a identificar se o problema está relacionado a um certificado de autoassinatura e, se for o caso, ignore o erro de autoassinatura. Obviamente, você pode verificar se há outros erros de SSL, se desejar.

O código que usamos (cortesia da Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) é o seguinte:

  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;
  }
}
Hooligancat
fonte
1
Para o meu caso, sslPolicyErrors foi RemoteCertificateNameMismatch e modifiquei a verificação do certificado porque não tínhamos os mesmos valores Subject e Issuer.
Ufuk Hacıoğulları
2
O certificado X509 usado pelo servidor Exchange alternava entre um autoassinado e um confiável. O uso desse código ajudou meu administrador de rede e eu não apenas a descobrir que era esse o caso, mas também resolvemos o problema ignorando apenas os certificados autoassinados. Isso foi perfeito!
Bret
20

Eu tive exatamente o mesmo problema e descobri que, por padrão, o Mail Shield do antivírus Avast tinha a "Conexão SSL de verificação" ativada. Certifique-se de desligar isso .

Pelo que sei, o Avast "abrirá" o correio, verificará se há vírus e o assinará usando seu próprio certificado, para que o correio não seja mais assinado pelo certificado do gmail, o que produz esse erro.

Solução 1:

  • Desative as verificações SSL do seu antivírus (ou de todo o escudo do correio).

Solução 2 (deve ser a melhor fala em segurança):

  • Obtenha de alguma forma o certificado usado pelo antivírus (o Avast tem a opção de exportá-lo)
  • Importe-o no seu cliente imap / pop / smtp antes de conectar-se ao servidor do Gmail.
tehCivilian
fonte
1
Você me salvou muito tempo. Levaria uma eternidade para descobrir que o meu antivírus seria o culpado, e não o meu código.
Arao6
13

Obtenha o mesmo erro ao enviar do Outlook por causa do SSL. A tentativa de configuração EnableSSL = false resolveu o problema.

exemplo:

var smtp = new SmtpClient
                {
                    Host = "smtp.gmail.com",                   
                    Port = 587,
                    EnableSsl = false,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    UseDefaultCredentials = false,                   
                    Credentials = new NetworkCredential("[email protected]", "xxxxx")
                };
Chitra Pannirselvam
fonte
3
o gmail não permitirá que você se conecte enquanto define o SSL como falso, tentei sua solução, não funcionou para mim.
Zeeshan Ajmal
Sim, isso é o que chamo de "básico" (vs "nenhum" ou "ssl") ....... essas configurações de e-mail são difíceis às vezes.
usar o seguinte código
9

Tem certeza de que está usando o endereço correto do servidor SMTP?

O smtp.google.com e o smtp.gmail.com funcionam, mas o certificado SSL é emitido para o segundo.

Pawel Lesnikowski
fonte
9

Eu tive o mesmo erro quando tentei enviar e-mail usando SmtpClient via servidor proxy (Usergate).

Verifica se o certificado continha o endereço do servidor, que não é igual ao endereço do servidor proxy, daí o erro. Minha solução: quando ocorrer um erro ao verificar o certificado, receba-o, exporte-o e verifique.

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

Código completo da minha classe de remetente de 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);
}

}

Evgeny Ivanov
fonte
7

Sei que estou atrasado neste jogo, mas não vi uma resposta aqui apontando para os logs system.diagnostics do TLS Stream.

Antes de fazer alterações no seu código, compreenda qual é o problema. O AuthenticationExceptioné uma exceção muito genérica que não conta muito. Para saber o que está acontecendo, edite o arquivo app.config para o seu aplicativo (ou crie um novo) e verifique se a fonte de rastreamento System.Net está ativada na system.diagnosticsseção, por exemplo:

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

Execute o aplicativo novamente e verifique o arquivo c: \ network.log. Você deve ver informações detalhadas sobre sua conexão TLS (SSL), por exemplo:

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

Sabendo o que causa o problema, você poderá resolvê-lo ou pelo menos restringir suas pesquisas no Google.

design de baixo nível
fonte
6

Meu problema ocorreu no Windows 2003 Server, ao chamar AuthenticateAsClient. As soluções acima (por exemplo, contornarServicePointManager.ServerCertificateValidationCallback ) não funcionaram.

Acontece que este é um bug no Windows 2003 e há um hotfix:

"Os aplicativos que usam a API de criptografia não podem validar um certificado X.509 no Windows Server 2003"

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

A instalação desse hotfix resolveu meu problema.

user326608
fonte
4

A pasta do site precisa de segurança do serviço de rede. Especialmente o web.config. Ele usa essa conta para acessar seu registro para os certificados. Isso interromperá a necessidade de adicionar um hack ao seu código.

Frans
fonte
4

Meu problema não era o fato de eu estar referenciando o servidor pelo endereço IP em vez do URL. Eu havia comprado um certificado assinado de uma CA para uso em uma rede privada. O URL especificado no certificado importa ao fazer referência ao servidor. Depois de referenciar o servidor pela URL no certificado, tudo começou a funcionar.

Josh
fonte
Essa resposta merece ser superior, porque indica um erro comum; as pessoas (inclusive eu) acham que o objetivo do Host é apenas encontrar o servidor.
Mojtaba
4

Verifique a data e hora do seu computador. Se estiver errado, atualize-o para a hora atual ou defina-o automaticamente para obter a hora na Internet.

Como os certificados estão vinculados a um período de tempo fixo, se o relógio estiver errado, é provável que você obtenha erros como esse. Nesse cenário, fixando a hora, o problema será corrigido.

AliSafari186
fonte
1
Se a data do sistema estiver "muito longe" da hora atual, a validade do certificado recebido do Google causará um problema. Ele é emitido e válido para informações que não têm muito tempo atual. Isso não é a única coisa que não pode causar esse problema. Mas certamente um que pode.
phil soady
1
Um lembrete extremamente útil para verificar isso no meu caso! A Navalha de Occam e tudo o que ... :) Agora, sobre a bateria do CMOS ...
Mike G
2

No nosso caso, o problema foi causado pelo certificado do servidor IIS. O assunto do certificado foi definido como nome DNS e os usuários estavam tentando acessar o site por endereço IP; portanto, a validação da certificação .NET falhou. O problema desapareceu quando os usuários começaram a usar o nome DNS.

Portanto, você deve alterar o URL do provedor para https: //CertificateSubject/xxx/xxx.application

Ludwo
fonte
Você pode elaborar isso? No meu caso, o aplicativo funciona em um servidor e não no outro. Não tenho noção ... não sou especialista, mas o domínio ainda está conectado ao que está funcionando e o certificado do servidor já está instalado nas duas máquinas. Ainda não entendo por que isso poderia ser relevante, pois diz "certificado remoto".
Michael Brennt
1

Adicionando esta linha funcionou para mim. Na verdade, isso confia em todos os certificados mencionados aqui . No entanto, isso pode ser usado principalmente para solucionar problemas. Se isso funcionar para você, significa que o certificado do servidor remoto não foi adicionado como certificado confiável na sua máquina.

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

O código 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("[email protected]");
            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("[email protected]", "");
            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;
}
Erdnase
fonte
0

Resolveu o meu problema

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

// Com referência a // Problema vem somente Use a linha acima para definir o SSl falso para resolver o erro quando o nome de usuário e a senha forem inseridos nas configurações de SMTP.

user3584038
fonte
13
Isso também está desativando a segurança.
Zoey
0

aqui está a solução que eu decidi usar.

        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;
        };
The Lazy Coder
fonte
0

O código da resposta aceita me ajudou a depurar o problema. Percebi então que o campo SN do certificateargumento não era o mesmo que eu pensava ser meu servidor SMTP. Ao definir a Hostpropriedade da instância SmtpClient como o valor SN do certificado, fui capaz de corrigir o problema.

ulu
fonte