"원격 인증서가 유효성 검사 절차에 따라 유효하지 않습니다." Gmail SMTP 서버 사용


221

이 오류가 발생합니다.

유효성 검사 절차에 따라 원격 인증서가 유효하지 않습니다.

C # 코드에서 Gmail의 SMTP 서버를 사용하여 이메일을 보내려고 할 때마다. 누군가이 문제에 대한 올바른 해결책을 제시 할 수 있습니까?

다음은 스택 추적입니다.

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 서버 사용을위한 구성에 대해 더 자세히 말씀해 주시겠습니까? 운이 좋은 추측 : SSL에 대한 보안 정책 (유효한 / 잘못된 SSL 인증서 사용과 같은)에 대해 더 자세히 알려 주시겠습니까?
Brian Clozel

오류를 재현 할 수있는 코드 샘플을 제공해 주시겠습니까?
zaTricky

답변:


302

경고 : 프로덕션 코드에서는 이것을 사용하지 마십시오!

이 문제를 해결하려면 인증서 유효성 검사를 해제 할 수 있습니다. 인증서가 잘못되어 오류가 발생했다는 확인을 얻기 위해이 작업을 수행해야합니다.

전화하기 전에이 메소드를 호출하십시오 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
이것은 해결책이 아닌 해킹입니까?
LB.

88
모든 보안을 완전히 끄는 대신 수정 사항을보고 싶습니다.
Roman Starkov

71
보안 문제에 대한 해결 방법으로 보안을 해제 할 수 있습니까? WTF?
John Nicholas

68
사람들이 여전히 솔루션이라고 생각하는 것처럼 이것을 하향 조정해야했습니다. 그건 그냥 보안 끄기. 생산 , 사람들에게 사용하지 마십시오 . 그는 심지어 그렇게 말합니다. esh.
MGOwen

51
공감. 나는 완전히이 생산에 사용해서는 안 동의 하지만 뭔가의 프로토 타입을 만들고있어 .... 그들이 제공 한 테스트 서버는 SSL을 사용하도록 강요했습니다. 인증서로 작업하는 것은 꽤나
새롭기

58

여기의 링크는 내 문제를 해결했습니다.

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

웹 서비스 (문제가있는 서버의) URL로 이동하여 IE의 작은 보안 아이콘을 클릭하여 인증서를 가져 왔습니다. 그런 다음 세부 정보 탭을 클릭하고 파일로 복사 버튼을 클릭하여 인증서를 .cer 파일로 내보낼 수있었습니다. 인증서를 로컬로 가져 오면 아래 지침을 사용하여 인증서를 서버의 인증서 저장소로 가져올 수있었습니다.

새 MMC를 시작하십시오. 파일-> 스냅인 추가 / 제거 ... 추가 ...를 클릭하십시오. 인증서를 선택하고 추가를 클릭하십시오. "컴퓨터 계정"라디오 버튼을 확인하십시오. 다음을 클릭하십시오.

다음 화면에서 클라이언트 컴퓨터를 선택하십시오. Finish를 클릭하십시오. 닫기를 클릭하십시오. 확인을 클릭하십시오. 이제 신뢰할 수있는 루트 인증 기관 인증서 저장소에 인증서를 설치하십시오. 이렇게하면 모든 사용자가 인증서를 신뢰할 수 있습니다.


스냅인이 아닌 인증서의 가져 오기 도구를 통해 인증서를 가져올 때 +1은 사용자 계정에만 해당됩니다. 스냅인을 사용하면 가져 오기 대상, 사용자 계정, 서비스 계정 또는 모든 사람을 선택할 수 있습니다. 포인터 주셔서 감사합니다. 나는 거기에서 1 ~ 2 분 동안 내 머리를 긁고 있었다!
davidb

명령 행을 사용하여 모든 dev / test 워크 스테이션을 자동화하려는 경우- certutil -f -p test -importPFX Root devcert.pfxcertutil -f -p test -importPFX MY devcert.pfx. 요구 프롬프트 관리자 명령에서 실행되도록합니다 (PFX 암호를 가정입니다 test)
DeepSpace101

T-Rex 덕분에 자체 서명 인증서를 사용하여 테스트하는 경우이 문제를 해결하는 가장 좋은 방법입니다!
ToastyMallows

37

인증서가 유효하지 않은 경우 사용자에게 계속하고 싶은지 묻는 메시지를 표시하여 코드를 개선 할 수 있습니다. 계속 하시겠습니까? 아래:

ServicePointManager.ServerCertificateValidationCallback = 
    new RemoteCertificateValidationCallback(ValidateServerCertificate);

그리고 다음과 같은 방법을 추가하십시오 :

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
클라우드 앱인 경우 누가 "계속"버튼을 클릭합니까?
Konstantin Isaev

34

파티에 약간 늦었지만 Yury의 솔루션과 같은 솔루션을 찾고 있다면 다음 코드를 사용하여 문제가 자체 서명 인증서와 관련이 있는지 확인하고 자체 서명 오류를 무시하십시오. 원하는 경우 다른 SSL 오류를 분명히 확인할 수 있습니다.

우리가 사용하는 코드 (Microsoft 제공-http://msdn.microsoft.com/en-us/library/office/dd633677(v= exchg.80 ) .aspx )는 다음과 같습니다.

  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
필자의 경우 sslPolicyErrors는 RemoteCertificateNameMismatch 였고 동일한 Subject 및 Issuer 값이 없기 때문에 인증서 확인을 수정했습니다.
Ufuk Hacıoğulları

2
사용한 Exchange 서버 X509Certificate는 자체 서명 된 것과 신뢰할 수있는 것 사이에서 계속 전환했습니다. 이 코드를 사용하면 네트워크 관리자에게 도움이되었으며 이것이 사실임을 알았을뿐만 아니라 자체 서명 된 인증서를 우회하여 문제를 완전히 해결했습니다. 이것은 완벽했다!
Bret

20

나는 똑같은 문제가 있었고 기본적으로 Avast 바이러스 백신 의 Mail Shield"Scan SSL connection"이 활성화되어 있음을 알았습니다 . 반드시 끄십시오 .

내가 아는 바에 따르면, Avast는 메일을 "열고" 바이러스를 검사 한 다음 자체 인증서를 사용하여 서명하여 더 이상 gmail의 인증서로 메일에 서명하지 않으므로 해당 오류가 발생하지 않습니다.

해결책 1 :

  • 안티 바이러스 (또는 전체 메일 쉴드)에서 SSL 스캔을 끕니다.

해결 방법 2 (최상의 보안 기능이어야 함) :

  • 바이러스 백신이 사용하는 인증서를 가져옵니다 (Avast에는 인증서를 내보낼 수있는 옵션이 있음)
  • Gmail 서버에 연결하기 전에 imap / pop / smtp 클라이언트에서 가져 오십시오.

1
당신은 나를 너무 많은 시간을 절약했습니다. 내 바이러스 백신이 내 코드가 아닌 책임이 있음을 알아 내기 위해 영원히 걸릴 것입니다.
arao6

13

SSL로 인해 Outlook에서 보내는 동안 동일한 오류가 발생합니다. EnableSSL = false 설정을 시도하여 문제가 해결되었습니다.

예:

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
SSL을 false로 설정하는 동안 Gmail에서 연결을 허용하지 않습니다. 솔루션이 작동하지 않았습니다.
Zeeshan Ajmal

예, 이것이 제가 "기본"(vs "없음"또는 "ssl")이라고 부르는 것입니다 .......이 이메일 설정은 때때로 까다 롭습니다.
granadaCoder

9

올바른 SMTP 서버 주소를 사용하고 있습니까?

smtp.google.com과 smtp.gmail.com은 모두 작동하지만 SSL 인증서는 두 번째 인증서에 발급됩니다.


9

SmtpClient프록시 서버 (Usergate) 를 통해 이메일을 보내려고 할 때도 같은 오류가 발생했습니다 .

인증서가 프록시 서버의 주소와 같지 않은 서버의 주소를 포함하는지 확인하여 오류를 확인합니다. 내 해결책 : 인증서를 확인하는 동안 오류가 발생하면 인증서를 받고 내보내고 확인하십시오.

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

이메일 발신자 클래스의 전체 코드 :

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

나는이 게임에서 꽤 늦었다는 것을 알고 있지만 여기서는 system.diagnostics 로그가 TLS 스트림을 가리키는 대답을 보지 못했습니다.

코드를 변경하기 전에 문제가 무엇인지 이해해야합니다. 는 AuthenticationException많은 얘기하지 않는 매우 일반적인 예외 중 하나입니다. 어떤 일이 벌어지고 있는지 배우려면 응용 프로그램의 app.config 파일을 편집하거나 새 파일을 만드십시오. 예를 들어 섹션 에서 System.Net 추적 소스를 활성화 했는지 확인하십시오 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>

응용 프로그램을 다시 실행하고 c : \ network.log 파일을 확인하십시오. TLS (SSL) 연결에 대한 자세한 정보가 표시되어야합니다. 예를 들면 다음과 같습니다.

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

문제의 원인을 알면 문제를 해결하거나 최소한 Google 검색 범위를 좁힐 수 있어야합니다.


6

AuthenticateAsClient를 호출 할 때 Windows 2003 Server에서 문제가 발생했습니다. 위의 솔루션 (예 : 우회 ServicePointManager.ServerCertificateValidationCallback)이 작동하지 않았습니다.

이것은 Windows 2003의 버그이며 핫픽스가 있습니다.

"Cryptography API를 사용하는 응용 프로그램은 Windows Server 2003에서 X.509 인증서를 확인할 수 없습니다."

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

이 핫픽스를 설치하면 문제가 해결되었습니다.


4

웹 사이트 폴더에는 네트워크 서비스 보안이 필요합니다. 특히 web.config. 이 계정을 사용하여 인증서의 레지스트리에 액세스합니다. 코드에 해킹을 추가 할 필요가 없습니다.


4

내 문제는 URL 대신 IP 주소로 서버를 참조한다는 것이 아닙니다. 개인 네트워크 내부에서 사용하기 위해 CA에서 서명 된 인증서를 구입했습니다. 서버를 참조 할 때 인증서에 지정된 URL이 중요합니다. 인증서의 URL로 서버를 참조하면 모든 것이 작동하기 시작했습니다.


이 답변은 일반적인 실수를 지적하기 때문에 상위가 될 가치가 있습니다. 사람들 (나 자신을 포함하여)은 Host의 목적이 서버를 찾기위한 것이라고 생각합니다.
Mojtaba

4

컴퓨터의 날짜와 시간을 확인하십시오. 틀린 경우 현재 시간으로 업데이트하거나 인터넷에서 시간을 얻도록 자동으로 설정하십시오.

인증서는 고정 된 기간에 연결되어 있으므로 시계가 잘못된 경우 이와 같은 오류가 발생할 수 있습니다. 이 시나리오에서는 시간을 수정하면 문제가 해결됩니다.


1
시스템 날짜가 현재 시간과 "너무 멀다"면 Google로부터받은 인증서의 유효성으로 인해 문제가 발생합니다. 현재 시간이 많지 않은 정보에 대해 발행되고 유효합니다. 이것은이 문제를 일으킬 수있는 것이 아닙니다. 그러나 그것은 확실히 할 수 있습니다.
phil soady 1

1
내 경우에 이것을 다시 확인하는 매우 유용한 알림! Occam의 면도기와 그 모든 것 : :) 이제 그 CMOS 배터리에 대해 ...
Mike G


2

우리의 경우 문제는 IIS 서버 인증서로 인한 것입니다. 인증서 제목이 DNS 이름으로 설정되었고 사용자가 IP 주소로 웹 사이트에 액세스하려고했기 때문에 .NET 인증 유효성 검사에 실패했습니다. 사용자가 DNS 이름을 사용하기 시작했을 때 문제가 사라졌습니다.

따라서 제공자 URL을 https : //CertificateSubject/xxx/xxx.application 으로 변경해야합니다 .


이것을 자세히 설명해 주시겠습니까? 필자의 경우 앱은 한 서버에서 작동하고 다른 서버에서는 작동하지 않습니다. 나는 단서가 없다 ... 나는 전문가는 아니지만 도메인은 여전히 ​​작동하는 도메인에 연결되어 있으며 서버 인증서는 이미 두 컴퓨터에 설치되어 있습니다. "원격 인증서"라고 표시되어 있기 때문에 왜 그것이 관련이있을 수 있는지 여전히 알 수 없습니다.
Michael Brennt


1

이 줄을 추가하면 나를 위해 일했습니다. 이것은 실제로 여기에 언급 된 모든 인증서를 신뢰합니다 . 그러나 이는 주로 문제 해결에 사용될 수 있습니다. 이것이 효과가 있으면 원격 서버의 인증서가 컴퓨터에서 신뢰할 수있는 인증서로 추가되지 않았 음을 의미합니다.

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

전체 코드는

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

내 문제를 해결했다

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

// 문제 참조 // SMTP 설정에 사용자 이름과 비밀번호를 입력 할 때 오류를 해결하기 위해 위의 줄을 사용하여 false SSl을 설정하십시오.


13
보안도 해제됩니다.
Zoey

0

여기에 내가 사용하기로 결정한 솔루션이 있습니다.

        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

허용 된 답변의 코드는 문제를 디버깅하는 데 도움이되었습니다. 그런 다음 certificate인수 의 SN 필드가 SMTP 서버라고 생각한 것과 같지 않다는 것을 깨달았습니다 . HostSmtpClient 인스턴스 의 속성을 인증서의 SN 값으로 설정하여 문제를 해결할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.