使用SSL向GMail发送邮件时,身份验证或解密失败

Mec*_*MK1 10 c# email mono gmail

我指的是关于C#SMTP邮件的指南.

这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,有一个关于SSL的例外,我无法修复它:

未处理的异常:System.Net.Mail.SmtpException:无法发送消息.---> System.IO.IOException:身份验证或解密失败.---> System.InvalidOperationException:SSL身份验证错误:RemoteCertificateNotAvailable,System.Net.Mail.SmtpClient.m__4上的RemoteCertificateChainErrors(System.Object sender,System.Security.Cryptography.X509Certificates.X509Certificate证书,System.Security.Cryptography.X509Certificates. X509链接,SslPolicyErrors sslPolicyErrors)[0x00000] in:0在System.Net.Security.SslStream + c__AnonStorey7.<> m__A(System.Security.Cryptography.X509Certificates.X509Certificate cert,System.Int32 [] certErrors)[0x00000] in: 0
在Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation(System.Security.Cryptography.X509Certificates.X509Certificate证书,System.Int32 []错误)[0x00000] in:0
at Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation( System.Security.Cryptography.X509Certificates.X509Certificate证书,System.Int32 []错误)[0x00000] in:0
在Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation(System.Security.Cryptography.X509Certificates.X509Certificate证书,System.Int32 [] certificateErrors)[0x00000] in:0 at Mono.Security.Protocol.Tls.Handshake.Client. TlsServerCertificate.validateCertificates(Mono.Security.X509.X509CertificateCollection证书)[0x00000] in:0,Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1()[0x00000] in:0
at Mono.Security.Protocol. Tls.Handshake.HandshakeMessage.Process()[0x00000] in:0
at(wrapper remoting-invoke-with-check)Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process()at 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] in:0 ---内部异常堆栈跟踪结束---在Mono.Security.Protocol.Tls.SslStreamBase .AsyncHandshakeCallback(IAsyncResult asyncResult)[0x00000] in:0 ---内部异常堆栈跟踪结束---在System.Net.Mail.SmtpClient.Send(System.Net.Mail.MailMessage消息)[0x00000] in:0
在csharpdungeon.MainClass.Main()[0x00000] in:0

ser*_*nko 23

检查以下代码是否适合您; 我已经在我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案取自这里

希望这有帮助,问候

  • 代码实际上忽略了证书错误,不利于安全性. (11认同)
  • -1:此代码错误,因为它无法解决CA未被识别的问题.它们仍然没有被识别,现在你已经开放了你的应用程序来解决大规模的MITM问题. (6认同)

aes*_*oza 14

正确的解决方案不是删除SSL证书验证.GMail拥有有效证书.问题是Mono似乎无法找到证书.

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

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

正确的解决方案是在您的机器中安装证书:

mozroots --import --ask-remove --machine
certmgr -ssl smtps://smtp.gmail.com:465
Run Code Online (Sandbox Code Playgroud)

这将有效地下载gmail证书,并使其可供单声道使用.


cdh*_*wie 6

您没有在Mono可以看到它们的地方安装相应的证书颁发机构.有关解决此错误的步骤,请查看Mono项目安全性常见问题解答.