web-dev-qa-db-ja.com

SMTPサーバーに有効な証明書がある場合、「検証手順に従ってリモート証明書が無効です」を取得する

これは一般的なエラーのように見えますが、回避策を見つけましたが(以下を参照)、最初に取得した理由を特定することはできません。

アプリケーションにSMTP機能を記述しており、既に機能しているSMTPにSSL機能を追加しようとしています。

私は、当社のMS Exchangeサーバーを使用してテストしています。具体的には、そのサーバーで有効になっているWebメールオプションを使用しています。接続を認証せずに匿名で送信することで、コードを介して内部的にメールを送信できますが、これらのメールは会社のポリシーにより外部のメールアドレスに中継されません。それに加えて、私はこれをお客様向けにプログラミングしていますが、すべてがオープンリレーや匿名接続を許可しているわけではありません。

Exchangeサーバーは明示的なSSL/TLSを使用していると思います。ポート25でサーバーのアドレスにtelnetを試行しましたが、テキスト応答、人間が読み取れる応答が得られました。

私は次のテストコードを持っています

SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);

ソリューションの検索中に私はこれに遭遇しました 「検証手順によるとリモート証明書は無効です。」Gmail SMTPサーバーを使用

私は次のコードを取得しました...

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

これは私のテストコードで動作します。ただし、私が書いている実際のプロセス(テストコードではなく)はバックグラウンドで実行され、ユーザーに実際に尋ねることはできません(代わりに、Windowsエラーログにエラーを報告します)。

私が始めたとき、私の質問は本当にこのエラーを取得している理由です。ブラウザでhttps:webmail.ourdomain.co.ukにアクセスすると、有効な証明書が表示され、証明書をインストールするオプションはありません(自己署名証明書の場合はそうでした)。

Certificate Screenshot ただし、ValidateServerCertificateメソッドでデバッグブレークポーティングを使用してコードを実行すると、証明書の値を確認し、ローカルサーバーの発行者と「使用しない」および「使用しない」プロパティを確認します。今日。これは、取得している証明書と一致しません。

また、ValidateServerCertificateのデバッグでsslPolicyErrorsフラグが何であるかを確認し、「RemoteCertificateChainErrors」および「RemoteCertificateNameMismatch」を表示しています。

だから私はこれについて何が欠けていますか...なぜ正しい証明書を使用していないのですか?使用するために証明書をローカルにインストールするために必要な手順がある場合、それらを知っている必要があるので、これを取得した場合の対処方法をお客様に伝えることができます。

ValidateServerCertificateメソッドからtrueを返すことでチェックをバイパスしたくはありません。これはバックグラウンドプロセスであるため、ユーザーに問い合わせることができないため、正しい/信頼できるコードを使用する方法を理解する必要があります。証明書。

誰かがアドバイスできることを願っています。

15
RosieC

私が最終的に見つけた答えは、サーバー上のSMTPサービスがhttpsと同じ証明書を使用していないということです。

ここで読んだ診断手順 彼らは同じ証明書を使用し、過去にこれを試したたびに彼らが行ったと仮定し、診断手順はまさに私が解決するためにやったことです問題を数回。

この場合、使用中の証明書が異なっていたため、これらの手順は機能しませんでした。この可能性は、私が出会ったことがないものです。

解決策は、サーバーから実際の証明書をエクスポートし、それを信頼できる証明書としてマシンにインストールするか、サーバー上のSMTPサービス用に別の有効な/信頼できる証明書を取得することです。これは現在、サーバーを管理するIT部門が担当しており、サーバーが何をしたいかを決定します。

7
RosieC

古い投稿ですが、「なぜ正しい証明書を使用しないのか」と言ったように、どのSSL証明書がSMTPに使用されているかを調べる方法を提供したいと思います( here を参照)

openssl s_client -connect exchange01.int.contoso.com:25 -starttls smtp

これにより、SMTPサービスに使用されるSSL証明書の概要が示されます。ここに表示される内容に基づいて、間違った証明書を(すでに行ったように)正しい証明書に置き換える(または証明書を手動で信頼する)ことができます。

2
BastianW

古い投稿ですが、この問題に対する解決策はあまり多くないので、自分の解決策を共有すると思いました。

古いWindows Server 2003マシンを実行している場合は、おそらく修正プログラム(KB938397)をインストールする必要があります。

この問題は、Windows Server 2003の暗号化API 2(CAPI2)がハッシュアルゴリズムのSHA2ファミリをサポートしていないために発生します。 CAPI2は、証明書を処理する暗号化APIの一部です。

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

何らかの理由で、Microsoftは、直接ダウンロードすることを許可する代わりに、この修正プログラムをメールで送信することを望んでいます。電子メールから修正プログラムへの直接リンクを次に示します。

http://hotfixv4.Microsoft.com/Windows Server 2003/sp3/Fix200653/3790/free/315159_ENU_x64_Zip.exe

0
user1003916