私のシステムでは、クライアントは電子メール サービスの構成を伝えます。これは、システム内でログ通信を送受信する責任があります。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;
}
}
何か案は?