「リモート証明書は、検証手順に従って無効です。」Gmail SMTPサーバーの使用


222

私はこのエラーを受け取ります:

検証手順によると、リモート証明書は無効です。

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
すべてのセキュリティを完全にオフにするのではなく、修正を見たいです。
ローマン・スターコフ2011

71
セキュリティ問題の回避策として、セキュリティをオフにできますか?WTF?
ジョンニコラス

68
人々はまだそれが解決策であると考えているように見えるので、これに反対票を投じなければなりませんでした。それはだJUST THE SECURITYをオフにします。本番環境では使用しないでください。彼もそう言います。シーッシュ。
MGOwen

51
賛成。これは本番環境では使用しないでください。ただし、プロトタイプを作成しています。彼らがたまたま私に提供したテストサーバーは、SSLを使用することを余儀なくさせています。証明書を扱うことは私にとってかなり新しいので、私はただQUICK WAY OUTが欲しいだけです。私はそれを本番環境で使用しない
TweeZz

58

ここのリンクは私の問題を解決しました。

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

(問題があったサーバー上の)WebサービスのURLに移動し、IEの小さなセキュリティアイコンをクリックして、証明書を表示しました。次に、[詳細]タブをクリックし、[ファイルにコピー]ボタンをクリックしました。これにより、証明書を.cerファイルとしてエクスポートできました。証明書をローカルに取得したら、以下の手順を使用して、サーバー上の証明書ストアに証明書をインポートすることができました。

新しいMMCを起動します。[ファイル]-> [スナップインの追加と削除] ... [追加...]をクリックし、[証明書]を選択して[追加]をクリックします。[コンピュータアカウント]ラジオボタンをオンにします。Nextをクリックします。

次の画面でクライアントコンピュータを選択します。完了をクリックします。閉じるをクリックします。OKをクリックします。証明書を信頼されたルート証明機関の証明書ストアにインストールします。これにより、すべてのユーザーが証明書を信頼できるようになります。


+1は、スナップインを介さずに、証明書のインポートツールを介して証明書をインポートする場合、ユーザーアカウント専用です。スナップインを使用すると、インポートの対象をユーザーアカウント、サービスアカウント、または全員から選択できます。ポインタをありがとう。そこで1、2分頭を掻きました。
davidb 2014

コマンドラインを使用して、すべての開発/テストワークステーションを自動化する場合- certutil -f -p test -importPFX Root devcert.pfxcertutil -f -p test -importPFX MY devcert.pfx。管理コマンドプロンプトで実行する必要があります(PFXパスワードがであると想定test
DeepSpace101

T-Rexのおかげで、自己署名証明書をテストに使用している場合、これが修正する最良の方法です。
ToastyMallows 2014年

36

証明書が有効でない場合は、続行するかどうかをユーザーに尋ねることで、コードを改善できます。続けたいですか?以下のように:

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 2013

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の値が同じではないため、証明書のチェックを変更しました。
UfukHacıoğulları2016

2
Exchangeサーバーが使用したX509Certificateは、自己署名したものと信頼されたものを切り替え続けました。このコードを使用すると、ネットワーク管理者と私はこれが事実であることを理解するだけでなく、自己署名証明書をバイパスするだけで問題を完全に解決しました。これは完璧でした!
2017年

20

まったく同じ問題があり、デフォルトではアバストアンチウイルスのメールシールドで「SSL接続のスキャン」がアクティブになっていることがわかりました。必ずオフにしてください

私の知る限りでは、Avastはメールを「開いて」ウイルスをスキャンし、独自の証明書を使用して署名するため、Gmailの証明書によってメールに署名されなくなり、エラーが発生しなくなります。

解決策1:

  • ウイルス対策(またはメールシールド全体)からのSSLスキャンをオフにします。

解決策2(セキュリティを話すのに最適である必要があります):

  • どういうわけかアンチウイルスによって使用される証明書を取得します(Avastにはそれをエクスポートするオプションがあります)
  • Gmailサーバーに接続する前に、imap / pop / smtpクライアントにインポートしてください。

1
あなたは私をそんなに時間を節約しました。私のアンチウイルスが私のコードではなく非難されることを理解するのに永遠にかかっただろう。
arao6 2016

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 2013

ええ、これは私が「基本」と呼ぶものです(vs「なし」または「ssl」)。......これらの電子メール設定は時々トリッキーです。
granadaCoder 2015


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

私はこのゲームにかなり遅れていることを知っていますが、TLSストリームのsystem.diagnosticsログを指す回答はここでは見ていません。

コードを変更する前に、問題の内容を理解してください。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のバグであり、修正プログラムがあります。

「暗号化APIを使用するアプリケーションは、Windows Server 2003でX.509証明書を検証できません」

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

この修正プログラムをインストールすると、問題が解決しました。


4

Webサイトフォルダーにはネットワークサービスセキュリティが必要です。特にweb.config。このアカウントを使用して、証明書のレジストリにアクセスします。これにより、コードにハックを追加する必要がなくなります。


4

私の問題は、URLではなくIPアドレスでサーバーを参照していることではありませんでした。プライベートネットワーク内で使用するために、CAから署名付き証明書を購入しました。証明書に指定されたURLは、サーバーを参照するときに重要です。証明書のURLでサーバーを参照すると、すべてが機能し始めました。


この答えはよくある間違いを指摘しているため、上に値するに値します。(私も含めて)人々は、ホストの目的はサーバーを見つけることだけにあると考えています。
Mojtaba

4

コンピュータの日付と時刻を確認します。間違っている場合は、現在の時刻に更新するか、インターネットから時刻を取得するように自動的に設定します。

証明書は一定の期間に関連付けられているため、クロックが間違っていると、このようなエラーが発生する可能性があります。そのシナリオでは、時間を修正することにより、問題が修正されます。


1
システムの日付が現在の時刻から「遠すぎる」場合、Googleから受け取った証明書の有効性により問題が発生します。現在発行されていない情報に対して発行され、有効であると見なされます。これは、この問題を引き起こす可能性のあるものだけではありません。しかし、それは確かに可能です。
phil soady 2014

1
私の場合、これを再確認するのに非常に便利なリマインダーです!OccamのRazorとそのすべて... :)そのCMOSバッテリーについて...
Mike G


2

この場合、問題はIISサーバー証明書が原因でした。証明書の件名がDNS名に設定され、ユーザーがIPアドレスでWebサイトにアクセスしようとしたため、.NET証明書の検証に失敗しました。ユーザーがDNS名の使用を開始すると、問題は解消されました。

したがって、プロバイダーURLをhttps://CertificateSubject/xxx/xxx.applicationに変更する必要があります


これについて詳しく説明してもらえますか?私の場合、アプリは1つのサーバーで動作し、他のサーバーでは動作しません。私は無知です...私は専門家ではありませんが、ドメインはまだ機能しているドメインに接続されており、サーバー証明書はすでに両方のマシンにインストールされています。それでも「リモート証明書」と書かれているので、なぜそれがとにかく関連しているのか理解できません。
Michael Brennt 2016


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、2014

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.