"Sertifikat jarak jauh tidak valid sesuai dengan prosedur validasi." menggunakan server SMTP Gmail

222

Saya mendapatkan kesalahan ini:

Sertifikat jarak jauh tidak valid sesuai dengan prosedur validasi.

setiap kali saya mencoba mengirim email menggunakan server SMTP Gmail dalam kode C # saya. Dapatkah seseorang mengarahkan saya ke arah yang benar untuk solusi untuk masalah ini?

Berikut ini adalah jejak tumpukan ...

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
sumber
1
Bisakah Anda memberi tahu kami lebih lanjut tentang konfigurasi Anda untuk menggunakan server SMTP Gmail? Tebakan saya: Dapatkah Anda memberi tahu kami lebih lanjut tentang kebijakan keamanan Anda untuk SSL (seperti menggunakan sertifikat SSL yang valid / tidak valid?).
Brian Clozel
Bisakah Anda memberi kami contoh kode tempat Anda dapat mereproduksi kesalahan?
zaTricky

Jawaban:

302

Peringatan: Jangan gunakan ini dalam kode produksi!

Sebagai solusinya, Anda dapat mematikan validasi sertifikat. Hanya lakukan ini untuk mendapatkan konfirmasi bahwa kesalahan sedang terjadi karena sertifikat yang buruk.

Panggil metode ini sebelum Anda menelepon 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
sumber
174
Ini peretasan, bukan perbaikan?
LB.
88
Ingin melihat perbaikan, daripada mematikan semua keamanan sepenuhnya.
Roman Starkov
71
sebagai solusi untuk masalah keamanan Anda dapat mematikan keamanan? WTF?
John Nicholas
68
Harus menurunkan ini, karena orang masih berpikir itu solusi. Ini HANYA MENGUBAH KEAMANAN OFF. JANGAN GUNAKAN DALAM PRODUKSI , orang. Dia bahkan bilang begitu. Sheesh.
MGOwen
51
Terpilih. Saya sepenuhnya setuju ini tidak boleh digunakan dalam produksi TETAPI .. Saya membuat prototipe sesuatu. Server uji yang mereka berikan memberi saya kekuatan untuk menggunakan SSL. Bekerja dengan sertifikat cukup baru bagi saya, jadi saya hanya ingin CEPAT WAY OUT , yang IMHO baik-baik saja karena saya TIDAK AKAN MENGGUNAKAN IT PRODUKSI
TweeZz
58

Tautan di sini menyelesaikan masalah saya.

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

Saya pergi ke url dari layanan web (di server yang memiliki masalah), mengklik ikon keamanan kecil di IE, yang memunculkan sertifikat. Saya kemudian mengklik pada tab Detail, mengklik tombol Salin Ke File, yang memungkinkan saya untuk mengekspor sertifikat sebagai file .cer. Setelah saya memiliki sertifikat secara lokal, saya dapat mengimpornya ke toko sertifikat di server menggunakan instruksi di bawah ini.

Mulai MMC baru. File -> Tambah / Hapus Snap-In ... Klik Tambah ... Pilih Sertifikat dan klik Tambah. Periksa tombol radio "Akun Komputer". Klik Selanjutnya.

Pilih komputer klien di layar berikutnya. Klik Selesai. Klik Tutup. Klik OK. SEKARANG instal sertifikat ke toko sertifikat Otoritas Sertifikasi Root Tepercaya. Ini akan memungkinkan semua pengguna mempercayai sertifikat.

T-Rex
sumber
+1 saat mengimpor sertifikat melalui alat impor pada sertifikat dan tidak melalui snap in, itu hanya untuk akun pengguna Anda. Menggunakan snap in memungkinkan Anda memilih untuk siapa impor, akun pengguna, akun layanan, atau semua orang. Terima kasih atas penunjuk Anda. Aku menggaruk kepalaku selama satu atau dua menit di sana!
davidb
Jika Anda ingin menggunakan baris perintah untuk mengotomatisasi semua workstation dev / test - certutil -f -p test -importPFX Root devcert.pfxdan certutil -f -p test -importPFX MY devcert.pfx. Perlu dijalankan dalam prompt perintah admin (dengan asumsi kata sandi PFX test)
DeepSpace101
Ini adalah cara terbaik untuk memperbaikinya jika Anda menggunakan sertifikat yang ditandatangani sendiri untuk pengujian, terima kasih T-Rex!
ToastyMallows,
36

Anda dapat meningkatkan kode dengan bertanya kepada pengguna ketika sertifikat tidak valid apakah dia ingin melanjutkan atau tidak. Apakah Anda ingin melanjutkan? Seperti di bawah ini:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Dan tambahkan metode seperti ini:

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
sumber
50
Siapa yang akan mengklik tombol "Lanjutkan", jika ini adalah aplikasi cloud?
Konstantin Isaev
34

Agak terlambat ke pesta, tetapi jika Anda mencari solusi seperti Yury, kode berikut akan membantu Anda mengidentifikasi jika masalah terkait dengan sertifikat tanda tangan dan, jika demikian abaikan kesalahan tanda tangan. Anda jelas dapat memeriksa kesalahan SSL lainnya jika diinginkan.

Kode yang kami gunakan (milik Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx ) adalah sebagai berikut:

  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
sumber
1
Untuk kasus saya sslPolicyErrors adalah RemoteCertificateNameMismatch dan saya memodifikasi cek sertifikat karena kami tidak memiliki nilai Subjek dan Penerbit yang sama.
Ufuk Hacıoğulları
2
Sertifikat X509 yang digunakan server Exchange terus berpindah antara yang ditandatangani sendiri dan yang Tepercaya. Menggunakan kode ini membantu admin jaringan saya dan saya tidak hanya mengetahui bahwa ini adalah masalahnya, tetapi juga memecahkan masalah sama sekali dengan hanya melewati sertifikat yang ditandatangani sendiri. Ini sempurna!
Bret
20

Saya memiliki masalah yang sama persis dan menemukan bahwa secara default Mail Shield dari Avast antivirus mengaktifkan "Pindai koneksi SSL" . Pastikan untuk mematikannya .

Dari pengetahuan saya, Avast akan "membuka" surat itu, memindai semua virus dan menandatanganinya menggunakan sertifikat sendiri sehingga surat itu tidak akan ditandatangani oleh sertifikat gmail lagi yang menghasilkan kesalahan itu.

Solusi 1:

  • Matikan pemindaian SSL dari antivirus Anda (atau seluruh pelindung email).

Solusi 2 (Harus berbicara dengan keamanan terbaik):

  • Dapatkan entah bagaimana sertifikat yang digunakan oleh antivirus (Avast memiliki opsi untuk mengekspornya)
  • Impor ke klien imap / pop / smtp Anda sebelum terhubung ke server gmail.
teh warga sipil
sumber
1
Anda menghemat banyak waktu saya. Akan diambil selamanya untuk mengetahui bahwa antivirus saya akan disalahkan dan bukan kode saya.
arao6
13

Dapatkan kesalahan yang sama saat mengirim dari pandangan karena ssl. Pengaturan yang dicoba EnableSSL = false menyelesaikan masalah.

contoh:

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
sumber
3
gmail tidak akan memungkinkan Anda untuk terhubung saat Anda mengatur SSL ke false, saya mencoba solusi Anda itu tidak berhasil untuk saya.
Zeeshan Ajmal
Ya, inilah yang saya sebut "dasar" (vs "tidak ada" atau "ssl") ....... pengaturan email itu terkadang rumit.
granadaCoder
9

Apakah Anda yakin menggunakan alamat server SMTP yang benar?

Baik smtp.google.com dan smtp.gmail.com berfungsi, tetapi sertifikat SSL dikeluarkan untuk yang kedua.

Pawel Lesnikowski
sumber
9

Saya memiliki kesalahan yang sama ketika saya mencoba mengirim email menggunakan SmtpClientmelalui server proxy (Usergate).

Memverifikasi sertifikat yang berisi alamat server, yang tidak sama dengan alamat server proxy, karenanya kesalahan. Solusi saya: ketika terjadi kesalahan saat memeriksa sertifikat, terima sertifikat, ekspor, dan periksa.

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

Kode lengkap dari kelas pengirim email saya:

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

Saya tahu saya cukup terlambat dalam permainan ini, tetapi saya belum melihat jawaban di sini menunjuk ke sistem. Logagnagnics untuk TLS Stream.

Sebelum Anda melakukan perubahan pada kode Anda, pastikan Anda memahami apa masalahnya. Ini AuthenticationExceptionadalah salah satu pengecualian yang sangat umum yang tidak banyak bicara. Untuk mempelajari apa yang terjadi di bawah tenda, edit file app.config untuk aplikasi Anda (atau buat yang baru) dan pastikan Anda memiliki sumber penelusuran System.Net diaktifkan di system.diagnosticsbagian ini, misalnya:

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

Jalankan kembali aplikasi Anda dan periksa file c: \ network.log. Anda harus melihat di sana informasi terperinci tentang koneksi TLS (SSL) Anda, misalnya:

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

Mengetahui apa yang menyebabkan masalah, Anda harus dapat menyelesaikannya atau setidaknya mempersempit pencarian Google Anda.

desain tingkat rendah
sumber
6

Masalah saya adalah pada Windows 2003 Server, saat memanggil AuthenticateAsClient. Solusi di atas (misalnya mengelakServicePointManager.ServerCertificateValidationCallback ) tidak bekerja.

Ternyata ini adalah bug di Windows 2003, dan ada perbaikan terbaru:

"Aplikasi yang menggunakan API Kriptografi tidak dapat memvalidasi sertifikat X.509 di Windows Server 2003"

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

Menginstal perbaikan terbaru ini menyelesaikan masalah saya.

pengguna326608
sumber
4

Folder situs web Anda memerlukan keamanan layanan jaringan. Terutama web.config. Ini menggunakan akun ini untuk mengakses registri Anda untuk sertifikat. Ini akan menghentikan kebutuhan untuk menambahkan retasan ke kode Anda.

Frans
sumber
4

Masalah saya bukan karena saya merujuk server dengan alamat IP alih-alih URL. Saya telah membeli sertifikat yang ditandatangani dari CA untuk digunakan di dalam jaringan pribadi. URL yang ditentukan pada sertifikat tidak masalah ketika mereferensikan server. Setelah saya mereferensikan server dengan URL dalam sertifikat semuanya mulai berfungsi.

Josh
sumber
Jawaban ini layak atas, karena menunjukkan kesalahan umum; orang (termasuk saya) berpikir bahwa tujuan Host hanya untuk menemukan server.
Mojtaba
4

Periksa Tanggal dan Waktu komputer Anda. Jika salah, perbarui ke waktu sekarang atau atur secara otomatis untuk mendapatkan waktu dari Internet.

Karena sertifikat terikat pada periode waktu yang tetap, jika jam Anda salah, Anda cenderung mendapatkan kesalahan seperti ini. Dalam skenario itu, dengan memperbaiki waktu, masalah akan diperbaiki.

AliSafari186
sumber
1
Jika tanggal sistem Anda "terlalu jauh" dari waktu sekarang, validitas sertifikat yang diterima dari google menyebabkan masalah. Itu terlihat dikeluarkan pada dan berlaku untuk info yang tidak banyak waktu saat ini. Ini bukan satu-satunya hal yang tidak dapat menyebabkan masalah ini. Tapi yang pasti bisa.
phil soady
1
Pengingat yang sangat berguna untuk memeriksa ulang ini dalam kasus saya! Pisau Cukur Occam dan semua itu ... :) Sekarang tentang baterai CMOS itu ...
Mike G
2

Dalam kasus kami masalah disebabkan oleh sertifikat server IIS. Subjek sertifikat diatur ke nama DNS dan pengguna mencoba mengakses situs web dengan alamat IP, sehingga validasi sertifikasi .NET gagal. Masalah menghilang ketika pengguna mulai menggunakan nama DNS.

Jadi, Anda harus mengubah URL Penyedia ke https: //CertificateSubject/xxx/xxx.application

Ludwo
sumber
Bisakah Anda menguraikan ini? Dalam aplikasi kasus saya berfungsi pada satu server dan tidak bekerja pada yang lain. Saya tidak mengerti ... Saya bukan ahli, tetapi domain masih terhubung dengan yang berfungsi, dan sertifikat server sudah diinstal pada kedua mesin. Masih tidak mengerti mengapa itu bisa menjadi relevan karena dikatakan "sertifikat jarak jauh".
Michael Brennt
1

Menambahkan baris ini berhasil untuk saya. Ini sebenarnya mempercayai semua sertifikat seperti yang disebutkan di sini . Namun, ini dapat digunakan terutama untuk pemecahan masalah. Jika ini cocok untuk Anda, berarti sertifikat server jarak jauh tidak ditambahkan sebagai sertifikat tepercaya di mesin Anda.

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

Kode lengkapnya adalah

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;
}
Hapus
sumber
0

Itu memecahkan masalah saya

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

// Dengan Referensi ke // Masalah hanya datang Gunakan baris di atas untuk mengatur SSl palsu untuk menyelesaikan kesalahan ketika nama pengguna dan kata sandi dimasukkan dalam pengaturan SMTP.

pengguna3584038
sumber
13
Ini juga mematikan keamanan.
Zoey
0

di sini adalah solusi yang saya putuskan untuk digunakan.

        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
sumber
0

Kode dari jawaban yang diterima membantu saya men-debug masalah. Saya kemudian menyadari bahwa bidang SN certificateargumen tidak sama dengan apa yang saya pikir adalah server SMTP saya. Dengan mengatur Hostproperti instance SmtpClient ke nilai SN sertifikat saya bisa memperbaiki masalah ini.

ulu
sumber