"Doğrulama prosedürüne göre uzak sertifika geçersiz." Gmail SMTP sunucusunu kullanma


222

Bu hatayı alıyorum:

Uzak sertifika, doğrulama yordamına göre geçersiz.

C # kodumda Gmail'in SMTP sunucusunu kullanarak e-posta göndermeye çalıştığımda. Birisi bu soruna bir çözüm bulmak için beni doğru yöne yönlendirebilir mi?

Aşağıdaki yığın izleme ...

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
Gmail SMTP sunucularını kullanma yapılandırmanız hakkında bize daha fazla bilgi verebilir misiniz? Şanslı tahminim: Bize SSL için güvenlik politikalarınız hakkında daha fazla bilgi verebilir misiniz (geçerli / geçersiz bir SSL sertifikası kullanmak gibi?).
Brian Clozel

Hatayı yeniden oluşturabileceğiniz bir kod örneği verebilir misiniz?
zaTricky

Yanıtlar:


302

Uyarı: Bunu üretim kodunda kullanmayın!

Çözüm olarak sertifika doğrulamasını kapatabilirsiniz. Hatalı sertifika nedeniyle hatanın atıldığına dair onay almak için bunu her zaman yapın.

Aramadan önce bu yöntemi çağırın 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;
            };
    }

175
Bu bir hack, bir düzeltme değil mi?
LB.

88
Tüm güvenliği tamamen kapatmak yerine bir düzeltme görmek isterim.
Roman Starkov

71
bir güvenlik sorununun çözümü olarak güvenliği kapatabilirsiniz? O NE LAN?
John Nicholas

68
İnsanlar hala bunun bir çözüm olduğunu düşünüyor gibi, bunu aşağılamak zorunda kaldı. Bu oluyor SADECE GÜVENLİK KAPATMAK. ÜRETİMDE KULLANMAYIN , insanlar. Hatta öyle diyor. Sheesh.
MGOwen

51
Upvoted. Bunun üretimde kullanılmaması gerektiğine katılıyorum AMA .. Bir şeyin prototipini yapıyorum. Bana sağladıkları test sunucusu beni SSL kullanmaya zorladı. Sertifikalarla çalışmak benim için oldukça yeni, bu yüzden ÜRETİMDE KULLANMAYACAĞIMIZ için
imho

58

Buradaki bağlantı sorunumu çözdü.

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

Web hizmetinin url'sine gittim (sorunu olan sunucuda), IE'de sertifikayı getiren küçük güvenlik simgesini tıkladım. Daha sonra Ayrıntılar sekmesini tıklattım ve sertifikayı bir .cer dosyası olarak dışa aktarmamı sağlayan Dosyaya Kopyala düğmesini tıkladım. Sertifikayı yerel olarak aldığımda, aşağıdaki talimatları kullanarak sertifikayı sunucudaki sertifika deposuna aktarabildim.

Yeni bir MMC başlatın. Dosya -> Ek Bileşen Ekle / Kaldır ... Ekle ... seçeneğini tıklayın Sertifikalar'ı seçin ve Ekle'yi tıklayın. "Bilgisayar Hesabı" radyo düğmesini kontrol edin. Sonrakine tıkla.

Bir sonraki ekranda istemci bilgisayarı seçin. Bitir'e tıklayın. Kapat'ı tıklayın. Tamam'ı tıklayın. ŞİMDİ sertifikayı Güvenilen Kök Sertifika Yetkilileri sertifika deposuna yükleyin. Bu, tüm kullanıcıların sertifikaya güvenmesini sağlar.


Sertifika, sertifikadaki içe aktarma aracı aracılığıyla içe aktarılırken, ek bileşen aracılığıyla değil, yalnızca kullanıcı hesabınız içindir. Ek bileşeni kullanmak, içe aktarmanın kim için olduğunu, kullanıcı hesabını, hizmet hesabını veya herkesi seçmenize olanak tanır. İşaretçiniz için teşekkürler. Orada bir iki dakika boyunca kafanı kaşıyordum!
davidb

Tüm dev / test iş istasyonlarını otomatikleştirmek için komut satırını kullanmak istiyorsanız - certutil -f -p test -importPFX Root devcert.pfxve certutil -f -p test -importPFX MY devcert.pfx. Bir yönetici komut isteminde çalıştırılması gerekiyor (PFX şifresi olduğu varsayılarak test)
DeepSpace101

Test için kendinden imzalı bir sertifika kullanıyorsanız, bunu düzeltmenin en iyi yolu, teşekkürler T-Rex!
ToastyMallows

36

Kodu, sertifikaya devam etmek isteyip istemediğini geçerli olmadığını sorarak kodu geliştirebilirsiniz. Devam etmek istiyor musun? Aşağıda olduğu gibi:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

Ve böyle bir yöntem ekleyin:

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
Bu bir bulut uygulamasıysa kim "Devam" düğmesini tıklayacak?
Konstantin Isaev

34

Partiye biraz geç, ancak Yury gibi bir çözüm arıyorsanız, aşağıdaki kod sorunun kendinden imzalı bir sertifika ile ilgili olup olmadığını belirlemenize yardımcı olacak ve eğer öyleyse kendi kendine imzalama hatasını göz ardı edecektir. İsterseniz açıkça diğer SSL hatalarını kontrol edebilirsiniz.

Kullandığımız kod (Microsoft - http://msdn.microsoft.com/en-us/library/office/dd633677(v=exchg.80).aspx'in izniyle ) aşağıdaki gibidir:

  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
Benim durumum için sslPolicyErrors RemoteCertificateNameMismatch oldu ve aynı Konu ve İhraççı değerlerine sahip olmadığımız için sertifika kontrolünü değiştirdim.
Ufuk Hacıoğulları

2
Exchange sunucusunun kullandığı X509Sertifika, kendinden imzalı olan ile Güvenilen olan arasında geçiş yapmaya devam etti. Bu kodu kullanmak ağ yöneticime yardımcı oldu ve sadece bunun böyle olduğunu anlamakla kalmadı, aynı zamanda sadece kendinden imzalı sertifikaları atlayarak sorunu tamamen çözdü. Bu mükemmeldi!
Bret

20

Ben de aynı sorunu vardı ve varsayılan olarak Avast antivirüs Posta Kalkanı "SSL taraması bağlantısı" etkin olduğunu anladım . Emin olun o kapatmak .

Bildiğim kadarıyla Avast , postayı "açacak" , herhangi bir virüs için tarayacak ve daha sonra kendi sertifikasını kullanarak imzalayacak, böylece posta artık bu hatayı üreten gmail sertifikası tarafından imzalanmayacak.

Çözüm 1:

  • Antivirüsünüzden (veya tüm posta kalkanından) SSL taramalarını kapatın.

Çözüm 2 (En iyi güvenlik konuşması olmalı):

  • Antivirüs tarafından kullanılan sertifikayı bir şekilde alın (Avast'ın dışa aktarma seçeneği vardır)
  • Gmail sunucusuna bağlanmadan önce imap / pop / smtp istemcinize aktarın.

1
Bana çok zaman kazandın. Sonsuza kadar antivirüs kodumu değil, suçlamak olacağını anladım.
arao6

13

SSL nedeniyle Outlook'tan gönderirken aynı hatayı alın. Deneme ayarı EnableSSL = false ayarı sorunu çözdü.

misal:

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 SSL'yi false olarak ayarlarken bağlanmanıza izin vermez, çözümünüzü denedim, benim için çalışmadı.
Zeeshan Ajmal

Evet, buna "temel" diyorum (vs "hiçbiri" veya "ssl") ....... bu e-posta ayarları bazen zor olabilir.
15:49

9

Doğru SMTP sunucu adresini kullandığınızdan emin misiniz?

Hem smtp.google.com hem de smtp.gmail.com çalışır, ancak ikincisine SSL sertifikası verilir.


9

SmtpClientProxy sunucusu (Usergate) ile e-posta göndermeye çalıştığımda aynı hatayla karşılaştım .

Sertifikanın, proxy sunucusunun adresine eşit olmayan sunucunun adresini içerdiğini ve dolayısıyla hatayı doğrular. Çözümüm: sertifikayı kontrol ederken bir hata oluştuğunda, sertifikayı alın, dışa aktarın ve kontrol edin.

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

E-posta gönderen sınıfımın tam kodu:

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

Bu oyuna oldukça geç kaldığımı biliyorum, ama burada sisteme işaret eden bir cevap görmedim. TLS Stream için teşhis kayıtları.

Kodunuzda herhangi bir değişiklik yapmadan önce sorunun ne hakkında olduğunu anladığınızdan emin olun. AuthenticationExceptionÇok söylemez o çok genel istisna biridir. Başlık altında neler olduğunu öğrenmek için uygulamanızın app.config dosyasını düzenleyin (veya yeni bir tane oluşturun) ve bölümde System.Net izleme kaynağının etkin olduğundan emin olun system.diagnostics:

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

Uygulamanızı yeniden çalıştırın ve c: \ network.log dosyasını kontrol edin. TLS (SSL) bağlantınız hakkında ayrıntılı bilgi görmelisiniz, örneğin:

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

Soruna neyin neden olduğunu bilerek, sorunu çözebilmeniz veya en azından Google aramalarınızı daraltabilmeniz gerekir.


6

Benim sorunum AuthenticateAsClient çağrılırken Windows 2003 Server'daydı. Yukarıdaki çözümler (örn.ServicePointManager.ServerCertificateValidationCallback ) işe yaramadı.

Bunun Windows 2003'te bir hata olduğu ve bir düzeltme olduğu ortaya çıktı:

"Şifreleme API'sını kullanan uygulamalar, Windows Server 2003'te bir X.509 sertifikasını doğrulayamıyor"

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

Bu düzeltmeyi yüklemek sorunumu çözdü.


5

Benim sorunum URL yerine IP adresi ile sunucuya referans değildi. Özel bir ağ içinde kullanmak için CA'dan imzalı bir sertifika satın almıştım. Sertifikada belirtilen URL, sunucuya başvururken önemli. Sertifikadaki URL ile sunucuya başvurduğumda her şey çalışmaya başladı.


Bu cevap üst olmayı hak ediyor, çünkü ortak bir hatayı gösteriyor; insanlar (ben dahil) Host'un amacının sadece sunucuyu bulmak olduğunu düşünüyorlar.
Mojtaba

4

Web sitesi klasörünüzün ağ hizmeti güvenliğine ihtiyacı var. Özellikle web.config. Sertifikaların kayıt defterine erişmek için bu hesabı kullanır. Bu, kodunuza bir saldırı ekleme ihtiyacını durduracaktır.


4

Bilgisayarınızın Tarih ve Saatini kontrol edin. Yanlışsa, geçerli saate güncelleyin veya İnternet'ten zamanı almak için otomatik olarak ayarlayın.

Sertifikalar sabit bir zaman dilimine bağlı olduğundan, saatiniz yanlışsa, bunun gibi hatalar alabilirsiniz. Bu senaryoda, zamanı düzelterek sorun giderilecektir.


1
Sistem tarihiniz geçerli saatten "çok uzak" ise, google'dan alınan sertifikanın geçerliliği bir soruna neden olur. Yayınlanmış ve geçerli zaman bilgisi olmayan bilgiler için geçerli görür. Bu, bu soruna neden olamayacak tek şey değil. Ama kesinlikle bunu yapabilir.
phil soady

1
Benim durumumda bunu iki kez kontrol etmek için son derece yararlı bir hatırlatma! Occam'ın Razor'u ve hepsi ... :) Şimdi bu CMOS pili hakkında ...
Mike G


2

Bizim durumumuzda sorun IIS sunucu sertifikasından kaynaklanmıştır. Sertifikanın konusu DNS adına ayarlandı ve kullanıcılar IP adresine göre web sitesine erişmeye çalıştıklarından .NET sertifikasyon doğrulaması başarısız oldu. Kullanıcılar DNS adını kullanmaya başladığında sorun ortadan kalktı.

Bu nedenle Sağlayıcı URL'nizi https: //CertificateSubject/xxx/xxx.application olarak değiştirmeniz gerekir


Bunu biraz açıklayabilir misin? Benim durumumda uygulama bir sunucuda çalışıyor ve diğerinde çalışmıyor. Clueless ... Uzman değilim, ancak etki alanı hala çalışan bir alana bağlı ve sunucu sertifikası zaten her iki makineye de yüklenmiş. Hala "uzak sertifika" yazdığı için bunun neden önemli olabileceğini anlamıyorum.
Michael Brennt


1

Bu satırı eklemek benim için işe yaradı. Bu aslında burada belirtilen tüm sertifikalara güvenir . Ancak, bu öncelikle sorun giderme için kullanılabilir. Bu sizin için işe yararsa, uzak sunucunun sertifikasının makinenize güvenilir bir sertifika olarak eklenmediği anlamına gelir.

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

Tam kod:

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

Sorunumu çözdü

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

// Referans ile // Sorun sadece geliyor SMTP ayarlarına kullanıcı adı ve şifre girildiğinde hatayı çözmek üzere yanlış SSl ayarlamak için yukarıdaki satırı kullanın.


13
Bu aynı zamanda güvenliği de kapatıyor.
Zoey

0

İşte kullanmaya karar verdiğim çözüm.

        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

Kabul edilen yanıtın kodu, sorunu ayıklamama yardımcı oldu. Daha sonra certificateargümanın SN alanının SMTP sunucum olduğunu düşündüğümle aynı olmadığını fark ettim . HostSmtpClient örneğinin özelliğini sertifikanın SN değerine ayarlayarak sorunu çözebildim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.