0

私のシステムでは、クライアントは電子メール サービスの構成を伝えます。これは、システム内でログ通信を送受信する責任があります。ASP.NET Web サイト内で、本番環境の Windows 2008 R2 サーバーから MailKit を使用して SSL IMAP サーバーとの接続をテストしようとすると、次のエラーが発生します。

例外: System.Security.Authentication.AuthenticationException: 検証手順によると、リモート証明書が無効です。 System.Security.Cryptography.X509Certificates.X509ChainStatus ステータス: RevocationStatusUnknown - 「失効機能は証明書の失効を確認できませんでした」

自分の PC または仮想マシン Windows 2008 R2 サーバーから接続しようとすると、接続に成功します。さらに、本番サーバーから OpenSSL.dll を使用してコマンド ライン経由で接続しようとすると、接続が成功します。同じコードを変更せずにコンソール アプリケーションを作成しました。このアプリケーションは IMAP サーバーに接続できますが、Web サイトまたはサービスから接続するとエラーがスローされます。

コードは次のとおりです。

 //test method
        public bool Testar()
        {
            try
            {
                using (var client = new MailKit.Net.Imap.ImapClient(new MailKit.ProtocolLogger("IMAP.log")))
                {
                        client.ServerCertificateValidationCallback = VerificarErrosCertificadosServer;
                        client.Connect(host, this.IsSSl);
                        client.Authenticate(emailUserName, emailPassword);
                        var inbox = client.Inbox;
                        inbox.Open(folderAccess);
                    client.Disconnect(true);
                    return true;
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                return false;
            }
        }


    //VerificarErrosCertificadosServer method
            private static bool VerificarErrosCertificadosServer(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                                                    System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
            {
                if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
                {
                    return true;
                }


                if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
                {
                    if (chain != null && chain.ChainStatus != null)
                    {
                        foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
                        {
                            Log.Info("System.Security.Cryptography.X509Certificates.X509ChainStatus status: " + status.Status.ToString() + " - " + status.StatusInformation);
                            if ((certificate.Subject == certificate.Issuer) &&
                               (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
                            {
                                // Self-signed certificates, untrusted root, but valid.
                                continue;
                            }
                            else
                            {
                                if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
                                {
                                    // any error
                                    return false;
                                }
                            }
                        }
                    }
                    return true;
                }
                else
                {
                    return false;
                }
            }

何か案は?

4

1 に答える 1