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)
Respostas:
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()
:fonte
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.
fonte
certutil -f -p test -importPFX Root devcert.pfx
ecertutil -f -p test -importPFX MY devcert.pfx
. Precisa ser executado em um comando de administração rápida (assumindo que a senha PFX étest
)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:
E adicione um método como este:
fonte
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:
fonte
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:
Solução 2 (deve ser a melhor fala em segurança):
fonte
Obtenha o mesmo erro ao enviar do Outlook por causa do SSL. A tentativa de configuração EnableSSL = false resolveu o problema.
exemplo:
fonte
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.
fonte
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.
Código completo da minha classe de remetente de email:
}
fonte
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 nasystem.diagnostics
seção, por exemplo: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:
Sabendo o que causa o problema, você poderá resolvê-lo ou pelo menos restringir suas pesquisas no Google.
fonte
Meu problema ocorreu no Windows 2003 Server, ao chamar AuthenticateAsClient. As soluções acima (por exemplo, contornar
ServicePointManager.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.
fonte
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.
fonte
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.
fonte
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.
fonte
Para aqueles que encontraram esse mesmo erro ao se conectar a um site local com um certificado autoassinado, a seguinte postagem no blog me ajudou.
http://brainof-dave.blogspot.com.au/2008/08/remote-certificate-is-invalid-according.html
fonte
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
fonte
Há um artigo de blog do MSDN sobre a investigação deste tipo de problemas:
Solucionando problemas do ASP.NET - O certificado remoto é inválido de acordo com o procedimento de validação:
http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/trouolving-asp-net-the-remote-certificate- é inválido de acordo com o procedimento de validação.aspx
fonte
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.
O código completo é
fonte
Resolveu o meu problema
// 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.
fonte
aqui está a solução que eu decidi usar.
fonte
O código da resposta aceita me ajudou a depurar o problema. Percebi então que o campo SN do
certificate
argumento não era o mesmo que eu pensava ser meu servidor SMTP. Ao definir aHost
propriedade da instância SmtpClient como o valor SN do certificado, fui capaz de corrigir o problema.fonte