質問
gmailのsmtpサーバーでC#を使用して電子メールを送信しようとすると、このエラーが表示されます。
"検証手順に従って、リモート証明書は無効です。
SSLが有効になっています
使用ポートは587
使用されるサーバー名は" Smtp.gmail.com"です。
ユーザー名とパスワードが正しい
outlook expressは同じPCで同じ設定で正常に動作します
c#プログラムは他の場所でも正常に動作します...このエラーはクライアントの場所でのみ発生します。
ご協力いただければ幸いです。
ありがとう
編集:@Andomar、クライアントのルート証明書はどこにありますか?これを修正するにはどうすればよいですか?
@ Alnitak、System.Net.Mailライブラリを使用してstarttlsを発行するにはどうすればよいですか
@ David、"(オブジェクト送信者、X509Certificate証明書、X509Chainチェーン、SslPolicyErrors sslPolicyErrors)"のパラメーターとして渡すもの>
デビッドに感謝します。これらの行を追加しました。しかし、私が理解している限り、このコードはSystem.Net.Mailと直接接続されていないため、何が起こっているのかまだ混乱しています。問題がなくなることを期待してください。
解決
ルート証明書がクライアントの信頼されたルート認証局ストアにあることも確認してください。これがサービスからのものである場合、ルート証明書をローカルマシンストアに追加することも役立ちます。理由をよりよく把握するために、次のポリシーが役立つことがわかりました...
public bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// No errors so continue…
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
// I’m just logging it to a label on the page,
// this should be stored or logged to the event log at this time.
lblStuff.Text += string.Format("Certificate error: {0} <BR/>", sslPolicyErrors);
// If the error is a Certificate Chain error then the problem is
// with the certificate chain so we need to investigate the chain
// status for further info. Further debug capturing could be done if
// required using the other attributes of the chain.
if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
{
foreach (X509ChainStatus status in chain.ChainStatus)
{
lblStuff.Text += string.Format("Chain error: {0}: {1} <BR/>", status.Status, status.StatusInformation);
}
}
// Do not allow this client to communicate
//with unauthenticated servers.
return false;
}
ポリシーを追加するには、次を使用します。これは、アプリケーションドメインに対して1回だけ実行する必要があります。
using System.Net;
...
ServicePointManager.ServerCertificateValidationCallback =
new Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
ポリシーを使用してエラーを完全に削除することもできますが、それを行うよりも問題を修正することをお勧めします。
他のヒント
適切なルート証明書がクライアントのストアにあるかどうかを確認します。そして、クライアントのシステム日付は正しいです。
STARTTLS
を使用していますか、またはポート587の接続が最初からSSL暗号化されていると想定していますか?
smtp.gmail.com
上のGoogleのサーバーにはSTARTTLSが必要です。
設定しましたか
client.EnableSsl = true;
Gmailで必要なため