【问题标题】:authentication or decryption has failed when sending mail to GMail using SSL使用 SSL 向 GMail 发送邮件时身份验证或解密失败
【发布时间】:2011-05-08 01:48:25
【问题描述】:

我指的是guide on C# SMTP mail

这是我的代码:

MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("dave.stockinger@gmail.com");
mail.To.Add("dave.stockinger@gmail.com");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("MyUserNameInGmail", "MyGmailPassWord");
SmtpServer.EnableSsl = true;

SmtpServer.Send(mail);

很遗憾,SSL 存在异常,我无法修复:

未处理的异常: System.Net.Mail.SmtpException:消息 无法发送。 ---> System.IO.IOException: 的 认证或解密有 失败的。 ---> System.InvalidOperationException:SSL 授权错误: 远程证书不可用, RemoteCertificateChainErrors 在 System.Net.Mail.SmtpClient.m__4 (System.Object 发送者, System.Security.Cryptography.X509Certificates.X509Certificate 证书, System.Security.Cryptography.X509Certificates.X509Chain 链,SslPolicyErrors sslPolicyErrors) [0x00000] 在 :0 在 System.Net.Security.SslStream+c__AnonStorey7.m__A (System.Security.Cryptography.X509Certificates.X509Certificate 证书,System.Int32[] 证书错误) [0x00000] 在 :0
在 Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate 证书,System.Int32[] 错误) [0x00000] 在 :0
在 Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate 证书,System.Int32[] 错误) [0x00000] 在 :0
在 Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate 证书,System.Int32[] 证书错误)[0x00000] 在 :0 在 Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection 证书)[0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] 在 :0
在 Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] 在 :0
在(包装 远程调用检查) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:进程 () 在 Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in :0 at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] 在 :0 --- 结束 内部异常堆栈跟踪 --- 在 Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] 在 :0 --- 结束 内部异常堆栈跟踪 --- 在 System.Net.Mail.SmtpClient.Send (System.Net.Mail.MailMessage 消息) [0x00000] 在 :0
在 csharpdungeon.MainClass.Main () [0x00000] 在 :0

【问题讨论】:

标签: c# email mono gmail


【解决方案1】:

检查以下代码是否适合您;我已经在我的 gmail 帐户上对其进行了测试,在 ubuntu 10.04LTS 上运行的 mono 2.0 似乎可以正常工作

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace mono_gmail
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            MailMessage mail = new MailMessage();

            mail.From = new MailAddress("my.name@gmail.com");
            mail.To.Add("my.name@hotmail.com");
            mail.Subject = "Test Mail";
            mail.Body = "This is for testing SMTP mail from GMAIL";

            SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
            smtpServer.Port = 587;
            smtpServer.Credentials = new System.Net.NetworkCredential("my.name", "my.password");
            smtpServer.EnableSsl = true;
            ServicePointManager.ServerCertificateValidationCallback = 
                delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
                    { return true; };
            smtpServer.Send(mail);
        }
    }
}

解决方案取自here

希望这会有所帮助,问候

【讨论】:

  • 代码实际上是忽略证书错误,不利于安全。
  • -1:这段代码是错误的,因为它没有解决CA不被识别的问题。它们仍未被识别,现在您的应用程序面临大量 MITM 问题。
【解决方案2】:

正确的解决方案是不要删除 SSL 证书验证。 GMail 有一个有效的证书。问题是 Mono 似乎找不到证书。

由于很多原因,这是完全错误的,但主要是因为它删除了一个非常重要的证书验证:

ServicePointManager.ServerCertificateValidationCallback = 
            delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
                { return true; };

正确的解决方法是在你的机器上安装证书:

mozroots --import --ask-remove --machine
certmgr -ssl smtps://smtp.gmail.com:465

这将有效地下载 gmail 证书,并使其可供 mono 使用。

【讨论】:

  • 我们有什么方法可以导入证书吗?我正在编写一个爬虫,当我到达它们时,我需要将证书导入单存储。
  • certmgr -ssl smtps://smtp.gmail.com:465 会盲目地允许它收到的任何证书 - 并将其暴露给 MITM 问题吗?
  • @TonoNam 我知道已经晚了,但现在是
【解决方案3】:

您没有在 Mono 可以看到它们的地方安装适当的证书颁发机构。请查看the Mono project security FAQ 了解纠正此错误的步骤。

【讨论】:

    【解决方案4】:

    如果您使用的是 SSL 而不是 TLS,则需要端口 465 而不是 587。

    http://mail.google.com/support/bin/answer.py?hl=en&answer=13287

    【讨论】:

      【解决方案5】:

      您是否尝试过更改端口,我知道 SSL 的默认 SMTP 端口是 465

      【讨论】:

      • 是的,但它从“崩溃”变为“冻结”
      【解决方案6】:

      SmtpClient with Gmail找到另一个解决方案

      certmgr -ssl smtps://smtp.gmail.com:465
      

      如果您正在运行单声道 Web 服务器,请使用与单声道进程相同的用户名运行命令。

      【讨论】:

        【解决方案7】:

        您需要使用 SSL 安全发送吗?您可以删除不需要 SSL 证书的声明 SmtpServer.EnableSsl = true;

        【讨论】:

          猜你喜欢
          • 2014-12-31
          • 2013-11-30
          • 2017-09-22
          • 2013-02-06
          • 2014-12-28
          • 2013-04-22
          • 1970-01-01
          • 2021-06-19
          • 2011-10-24
          相关资源
          最近更新 更多