Giấy chứng nhận từ xa không hợp lệ theo quy trình xác nhận. sử dụng máy chủ Gmail Gmail


222

Tôi đang gặp lỗi này:

Chứng chỉ từ xa không hợp lệ theo quy trình xác nhận.

bất cứ khi nào tôi cố gắng gửi e-mail bằng máy chủ SMTP của Gmail bằng mã C # của mình. Ai đó có thể chỉ cho tôi hướng đi đúng cho một giải pháp cho vấn đề này không?

Sau đây là dấu vết ngăn xếp ...

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
Bạn có thể cho chúng tôi biết thêm về cấu hình của bạn để sử dụng máy chủ Gmail SMTP không? Dự đoán may mắn của tôi: Bạn có thể cho chúng tôi biết thêm về các chính sách bảo mật của bạn đối với SSL (như sử dụng chứng chỉ SSL hợp lệ / không hợp lệ không?).
Brian Clozel

Bạn có thể cho chúng tôi một mẫu mã nơi bạn có thể tái tạo lỗi không?
zaTricky

Câu trả lời:


302

Cảnh báo: Không sử dụng mã này trong mã sản xuất!

Như một giải pháp thay thế, bạn có thể tắt xác nhận chứng chỉ. Chỉ bao giờ làm điều này để có được xác nhận rằng lỗi đang bị ném vì một chứng chỉ xấu.

Gọi phương thức này trước khi bạn gọi 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
Đây là một hack, không phải là một sửa chữa?
LB.

88
Rất thích xem một bản sửa lỗi, thay vì tắt hoàn toàn bảo mật.
Roman Starkov

71
như một cách giải quyết vấn đề bảo mật bạn có thể tắt bảo mật không? WTF?
John Nicholas

68
Phải đánh giá thấp điều này, vì mọi người dường như vẫn nghĩ đó là một giải pháp. Đó là CHỈ CẦN BẢO MẬT. KHÔNG SỬ DỤNG TRONG SẢN XUẤT , mọi người. Anh ấy thậm chí còn nói như vậy. Sheesh.
MGOwen

51
Nâng cao. Tôi hoàn toàn đồng ý rằng điều này không nên được sử dụng trong sản xuất NHƯNG .. Tôi đang tạo ra một nguyên mẫu của một cái gì đó. Máy chủ thử nghiệm họ tình cờ cung cấp cho tôi buộc tôi sử dụng SSL. Làm việc với các chứng chỉ khá mới đối với tôi, vì vậy tôi chỉ muốn một CÁCH NHANH
CHÓNG, imho

58

Các liên kết ở đây đã giải quyết vấn đề của tôi.

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

Tôi đã truy cập url của dịch vụ web (trên máy chủ có sự cố), nhấp vào biểu tượng bảo mật nhỏ trong IE, nơi đưa ra chứng chỉ. Sau đó, tôi nhấp vào tab Chi tiết, nhấp vào nút Sao chép vào Tệp, cho phép tôi xuất chứng nhận dưới dạng tệp .cer. Khi tôi có chứng chỉ cục bộ, tôi có thể nhập nó vào kho chứng chỉ trên máy chủ bằng các hướng dẫn bên dưới.

Bắt đầu một MMC mới. Tệp -> Thêm / Xóa Snap-In ... Nhấp vào Thêm ... Chọn Chứng chỉ và nhấp vào Thêm. Kiểm tra nút radio "Tài khoản máy tính". Nhấn tiếp.

Chọn máy tính khách trong màn hình tiếp theo. Nhấp vào Kết thúc. Bấm Đóng. Nhấn OK. BÂY GIỜ cài đặt chứng chỉ vào kho chứng chỉ ủy quyền chứng chỉ gốc đáng tin cậy. Điều này sẽ cho phép tất cả người dùng tin tưởng vào chứng chỉ.


+1 khi nhập chứng chỉ qua công cụ nhập trên chứng chỉ và không thông qua snap in, nó chỉ dành cho tài khoản người dùng của bạn. Sử dụng snap in cho phép bạn chọn người nhập, tài khoản người dùng, tài khoản dịch vụ hoặc tất cả mọi người. Cảm ơn con trỏ của bạn. Tôi đã gãi đầu trong một hoặc hai phút ở đó!
davidb

Nếu bạn muốn sử dụng dòng lệnh để tự động hóa trên tất cả các máy trạm dev / test - certutil -f -p test -importPFX Root devcert.pfxcertutil -f -p test -importPFX MY devcert.pfx. Cần được chạy trong dấu nhắc lệnh của quản trị viên (giả sử mật khẩu PFX là test)
DeepSpace101

Đây là cách tốt nhất để khắc phục nếu bạn đang sử dụng chứng chỉ tự ký để thử nghiệm, cảm ơn T-Rex!
ToastyMallows

36

Bạn có thể cải thiện mã bằng cách hỏi người dùng khi chứng chỉ không hợp lệ cho dù anh ta có muốn tiếp tục hay không. Bạn có muốn tiếp tục? Như sau:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Và thêm một phương thức như thế này:

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
Ai sẽ nhấp vào nút "Tiếp tục", nếu đây là ứng dụng đám mây?
Konstantin Isaev

34

Đến bữa tiệc muộn một chút, nhưng nếu bạn đang tìm giải pháp như mã của Yury, mã sau đây sẽ giúp bạn xác định xem sự cố có liên quan đến chứng chỉ tự ký hay không, nếu vậy hãy bỏ qua lỗi tự ký. Bạn rõ ràng có thể kiểm tra các lỗi SSL khác nếu bạn muốn.

Mã chúng tôi sử dụng (lịch sự của Microsoft - http://msdn.microsoft.com/en-us/l Library / office / dd633677 (v = exchg.80 ) .aspx ) như sau:

  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
Đối với trường hợp của tôi, sslPolicyErrors là RemoteCertertNameMismatch và tôi đã sửa đổi kiểm tra chứng chỉ vì chúng tôi không có cùng giá trị Chủ thể và Nhà phát hành.
Ufuk Hacıoğulları

2
X509 Chứng nhận máy chủ Exchange được sử dụng liên tục chuyển đổi giữa một người tự ký và một Người đáng tin cậy. Sử dụng mã này đã giúp quản trị viên mạng của tôi và tôi không chỉ nhận ra rằng đây là trường hợp, mà còn giải quyết vấn đề hoàn toàn bằng cách chỉ bỏ qua các chứng chỉ tự ký. Điều này thật hoàn hảo!
Bret

20

Tôi đã có cùng một vấn đề chính xác và nhận ra rằng theo mặc định, phần mềm diệt virus Mail Shield từ Avast đã kích hoạt "Quét kết nối SSL" . Hãy chắc chắn để tắt nó .

Theo hiểu biết của tôi, Avast sẽ "mở" thư, quét bất kỳ vi-rút nào và sau đó ký tên bằng chứng chỉ của chính nó để thư sẽ không được ký bởi chứng chỉ của gmail nữa gây ra lỗi đó.

Giải pháp 1:

  • Tắt quét SSL từ phần mềm chống vi-rút của bạn (hoặc toàn bộ lá chắn thư).

Giải pháp 2 (Nên nói bảo mật tốt nhất):

  • Nhận bằng cách nào đó chứng chỉ được sử dụng bởi phần mềm chống vi-rút (Avast có tùy chọn để xuất nó)
  • Nhập nó trong ứng dụng khách imap / pop / smtp của bạn trước khi kết nối với máy chủ gmail.

1
Bạn đã tiết kiệm cho tôi rất nhiều thời gian. Sẽ mãi mãi nhận ra rằng phần mềm chống vi-rút của tôi sẽ bị đổ lỗi chứ không phải mã của tôi.
arao6

13

Nhận lỗi tương tự trong khi gửi từ triển vọng vì ssl. Đã thử cài đặt EnableSSL = false đã giải quyết vấn đề.

thí dụ:

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 sẽ không cho phép bạn kết nối trong khi bạn đặt SSL thành false, tôi đã thử giải pháp của bạn, nó không hoạt động với tôi.
Zeeshan Ajmal

Vâng, đây là cái mà tôi gọi là "cơ bản" (so với "không" hoặc "ssl") ....... đôi khi các cài đặt email đó rất khó.
granadaCoder

9

Bạn có chắc là bạn đang sử dụng đúng địa chỉ máy chủ SMTP?

Cả smtp.google.com và smtp.gmail.com đều hoạt động, nhưng chứng chỉ SSL được cấp cho cái thứ hai.


9

Tôi đã gặp lỗi tương tự khi tôi cố gửi email bằng SmtpClientmáy chủ proxy (Usergate).

Xác minh chứng chỉ chứa địa chỉ của máy chủ, không bằng địa chỉ của máy chủ proxy, do đó xảy ra lỗi. Giải pháp của tôi: khi xảy ra lỗi trong khi kiểm tra chứng chỉ, nhận chứng chỉ, xuất và kiểm tra.

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

Mã đầy đủ của lớp người gửi email của tôi:

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

Tôi biết tôi đến khá muộn trong trò chơi này, nhưng tôi chưa thấy câu trả lời nào ở đây chỉ vào nhật ký system.diagnostics cho Luồng TLS.

Trước khi bạn thực hiện bất kỳ thay đổi nào đối với mã của mình, hãy đảm bảo bạn hiểu vấn đề là gì. Đây AuthenticationExceptionlà một trong những ngoại lệ rất chung chung mà không nói nhiều. Để tìm hiểu những gì đang diễn ra, hãy chỉnh sửa tệp app.config cho ứng dụng của bạn (hoặc tạo một tệp mới) và đảm bảo rằng bạn đã bật nguồn theo dõi System.Net trong system.diagnosticsphần, ví dụ:

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

Chạy lại ứng dụng của bạn và kiểm tra tệp c: \ network.log. Bạn sẽ thấy thông tin chi tiết về kết nối TLS (SSL) của mình, ví dụ:

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

Biết nguyên nhân gây ra sự cố, bạn sẽ có thể giải quyết nó hoặc ít nhất là thu hẹp các tìm kiếm Google của bạn.


6

Vấn đề của tôi là trên Windows 2003 Server, khi gọi AuthenticicateAsClient. Các giải pháp trên (ví dụ: lách luật ServicePointManager.ServerCertificateValidationCallback) không hoạt động.

Hóa ra đây là một lỗi trong Windows 2003 và có một hotfix:

"Các ứng dụng sử dụng API mã hóa không thể xác thực chứng chỉ X.509 trong Windows Server 2003"

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

Cài đặt hotfix này đã giải quyết vấn đề của tôi.


4

Thư mục trang web của bạn cần bảo mật dịch vụ mạng. Đặc biệt là web.config. Nó sử dụng tài khoản này để truy cập vào sổ đăng ký của bạn cho các chứng chỉ. Điều này sẽ ngăn chặn sự cần thiết phải thêm một hack vào mã của bạn.


4

Vấn đề của tôi không phải là tôi đã tham chiếu máy chủ bằng địa chỉ IP thay vì URL. Tôi đã mua chứng chỉ đã ký từ CA để sử dụng trong mạng riêng. URL được chỉ định trên chứng chỉ có vấn đề khi tham chiếu máy chủ. Khi tôi đã tham chiếu máy chủ bằng URL trong chứng chỉ, mọi thứ bắt đầu hoạt động.


Câu trả lời này xứng đáng được đặt lên trên, bởi vì nó chỉ ra một lỗi phổ biến; mọi người (bao gồm cả tôi) nghĩ rằng mục đích của Host chỉ là để tìm máy chủ.
Mojtaba

4

Kiểm tra ngày và giờ trên máy tính của bạn. Nếu nó sai, hãy cập nhật nó về thời gian hiện tại hoặc tự động đặt nó để lấy thời gian từ Internet.

Vì chứng chỉ được gắn với một khoảng thời gian cố định, nếu đồng hồ của bạn sai, bạn có thể gặp lỗi như thế này. Trong kịch bản đó, bằng cách sửa thời gian, vấn đề sẽ được khắc phục.


1
Nếu ngày hệ thống của bạn "quá xa" so với thời điểm hiện tại, tính hợp lệ của chứng chỉ nhận được từ google sẽ gây ra sự cố. Nó thấy được ban hành và hợp lệ cho thông tin không có nhiều thời gian hiện tại. Đây không phải là điều duy nhất không thể gây ra vấn đề này. Nhưng nó chắc chắn một trong những có thể.
phil soady

1
Một lời nhắc nhở cực kỳ hữu ích để kiểm tra lại điều này trong trường hợp của tôi! Occam's Razor và tất cả những thứ đó ... :) Bây giờ về pin CMOS đó ...
Mike G


2

Trong trường hợp của chúng tôi vấn đề là do chứng chỉ máy chủ IIS. Chủ đề của chứng chỉ được đặt thành tên DNS và người dùng đang cố truy cập trang web bằng địa chỉ IP, vì vậy việc xác thực .NET không thành công. Sự cố biến mất khi người dùng bắt đầu sử dụng tên DNS.

Vì vậy, bạn phải thay đổi URL Nhà cung cấp của mình thành https: //Cert veSubject / xxxx / xxxx.application


Bạn có thể giải thích điều này? Trong trường hợp của tôi, ứng dụng hoạt động trên một máy chủ và không hoạt động trên máy chủ khác. Tôi không biết ... Tôi không phải là chuyên gia, nhưng tên miền vẫn được kết nối với máy chủ đang hoạt động và chứng chỉ máy chủ đã được cài đặt trên cả hai máy. Vẫn không hiểu tại sao điều đó có thể liên quan dù sao đi nữa vì nó nói "chứng chỉ từ xa".
Michael Brennt


1

Thêm dòng này làm việc cho tôi. Điều này trong thực tế tin tưởng tất cả các chứng chỉ như được đề cập ở đây . Tuy nhiên, điều này có thể được sử dụng chủ yếu để khắc phục sự cố. Nếu điều này phù hợp với bạn, thì điều đó có nghĩa là chứng chỉ của máy chủ từ xa không được thêm làm chứng chỉ tin cậy trong máy của bạn.

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

Mã đầy đủ là

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

Nó đã giải quyết vấn đề của tôi

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

// Với tham chiếu đến // Vấn đề chỉ đến Sử dụng dòng trên để đặt SSl sai để giải quyết lỗi khi tên người dùng và mật khẩu được nhập trong cài đặt SMTP.


13
Điều này cũng đang tắt an ninh.
Zoey

0

đây là giải pháp mà tôi quyết định sử dụng

        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

Mã từ câu trả lời được chấp nhận đã giúp tôi gỡ lỗi vấn đề. Sau đó tôi nhận ra rằng trường SN của certificateđối số không giống như những gì tôi nghĩ là máy chủ SMTP của tôi. Bằng cách đặt thuộc Hosttính của phiên bản SmtpClient thành giá trị SN của chứng chỉ, tôi có thể khắc phục sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.