C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

「SSL証明書の検証を無視させる」はなぜ必要ですか? /白熊 (20/01/09(Thu) 16:28) #93684
Re[1]: 「SSL証明書の検証を無視させる」はなぜ必要ですか? /Azulean (20/01/10(Fri) 06:37) #93685
  └ Re[2]: 「SSL証明書の検証を無視させる」はなぜ必要ですか? /白熊 (20/01/10(Fri) 10:12) #93686
    └ Re[3]: 「SSL証明書の検証を無視させる」はなぜ必要ですか? /はまぐり (20/01/10(Fri) 10:39) #93687
      └ Re[4]: 「SSL証明書の検証を無視させる」はなぜ必要ですか? /はまぐり (20/01/10(Fri) 10:42) #93688
        └ Re[5]: 「SSL証明書の検証を無視させる」はなぜ必要ですか? /白熊 (20/01/10(Fri) 11:43) #93689 解決済み


親記事 / ▼[ 93685 ]
■93684 / 親階層)  「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ 白熊 (1回)-(2020/01/09(Thu) 16:28:08)

分類:[.NET 全般] 

MailKitを使用してメール受信プログラムを作っています。
ソースの★部分でSSL証明書の検証を無視させないと、Connect()で例外が発生します。

いろいろなサイトを読んできたのですが、「SSL証明書の検証を無視させる」コードがなぜ必要なのかわかりません。
そもそも何が証明書を求めているのでしょうか?
また、他サイトで「開発環境でだけ使用すべき」記載があるのですが、本番環境ではどのようになるのでしょうか?
また、Connect()メソッドでuseSsl=trueであっても必要なのでしょうか?

基本的な知識が欠落していると思いますが、どなたかわかりやすくご教示いただけないでしょうか?
よろしくお願いいたします。


pop3.Connect("xxxxx", 110, useSsl:true);

using (var pop3 = new Pop3Client())
{
	 //SSL証明書の検証を無視させる。★
	 System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
	 
	 pop3.Connect("xxxxx", 110, useSsl:false);
}

[ □ Tree ] 返信 編集キー/

▲[ 93684 ] / ▼[ 93686 ]
■93685 / 1階層)  Re[1]: 「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ Azulean (1129回)-(2020/01/10(Fri) 06:37:34)
No93684 (白熊 さん) に返信
> いろいろなサイトを読んできたのですが、「SSL証明書の検証を無視させる」コードがなぜ必要なのかわかりません。
> そもそも何が証明書を求めているのでしょうか?

useSsl を true に設定し、SSL で通信しようとするからです。
「SSL 証明書」で検索するといくつかの解説サイトが見つかるかと思います。

https://www.cybertrust.co.jp/blog/ssl/knowledge/ssl-basics.html
https://ssl.sakura.ad.jp/column/ssl/
https://jp.globalsign.com/ssl-pki-info/ssl_beginner/sslcerts.html

「なりすまし」や「改ざん」の予防、第三者による保証などといった感じで捉えておくと良いかと思います。


> また、他サイトで「開発環境でだけ使用すべき」記載があるのですが、本番環境ではどのようになるのでしょうか?

SSL ベースの通信をするなら、そのサーバーで SSL 証明書を適切に購入・導入してください。
(社内に閉じているなど、特異なケースでは購入せずに済む可能性はありますが、インターネット上に公開する場合は購入が必要です)

開発環境では、テスト用のサーバーであることも多く、SSL 証明書を買えないので、検証を無効にすることが多いのでしょう。


> また、Connect()メソッドでuseSsl=trueであっても必要なのでしょうか?

逆です。
useSsl = true だからこそ必要です。
[ 親 93684 / □ Tree ] 返信 編集キー/

▲[ 93685 ] / ▼[ 93687 ]
■93686 / 2階層)  Re[2]: 「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ 白熊 (2回)-(2020/01/10(Fri) 10:12:46)
Azulean様
ご教授ありがとうございます。

>
>>また、Connect()メソッドでuseSsl=trueであっても必要なのでしょうか?
>
> 逆です。
> useSsl = true だからこそ必要です。



まずPOP3サーバーでポートは110を指定し、SSL認証は使用していません。useSslはfalseです。
この状態でuseSslにfalseを指定してConnectを実行すると例外が発生します。

pop3.Connect("xxxxx", 110, useSsl:false);
例外内容
MailKit.Security.SslHandshakeException
An error occurred while attempting to establish an SSL or TLS connection.

The SSL certificate presented by the server is not trusted by the system for one or more of the following reasons:
1. The server is using a self-signed certificate which cannot be verified.
2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate.
3. The certificate presented by the server is expired or invalid.

See https://github.com/jstedfast/MailKit/blob/master/FAQ.md#InvalidSslCertificate for possible solutions.


次に、証明書を無視するコードを記載し実行するとメールを受信することができました。
System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
pop3.Connect("xxxxx", 110, useSsl:false);


どうしてuseSsl=falseなのにSSL認証をチェックしようとするのでしょうか?
[ 親 93684 / □ Tree ] 返信 編集キー/

▲[ 93686 ] / ▼[ 93688 ]
■93687 / 3階層)  Re[3]: 「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ はまぐり (82回)-(2020/01/10(Fri) 10:39:37)
No93686 (白熊 さん) に返信
> Azulean様
> ご教授ありがとうございます。
>
>>
> >>また、Connect()メソッドでuseSsl=trueであっても必要なのでしょうか?
>>
>>逆です。
>>useSsl = true だからこそ必要です。
>
>
>
> まずPOP3サーバーでポートは110を指定し、SSL認証は使用していません。useSslはfalseです。
> この状態でuseSslにfalseを指定してConnectを実行すると例外が発生します。
>
> pop3.Connect("xxxxx", 110, useSsl:false);
> 例外内容
> MailKit.Security.SslHandshakeException
> An error occurred while attempting to establish an SSL or TLS connection.
>
> The SSL certificate presented by the server is not trusted by the system for one or more of the following reasons:
> 1. The server is using a self-signed certificate which cannot be verified.
> 2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate.
> 3. The certificate presented by the server is expired or invalid.
>
> See https://github.com/jstedfast/MailKit/blob/master/FAQ.md#InvalidSslCertificate for possible solutions.
>
>
> 次に、証明書を無視するコードを記載し実行するとメールを受信することができました。
> System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
> pop3.Connect("xxxxx", 110, useSsl:false);
>
>
> どうしてuseSsl=falseなのにSSL認証をチェックしようとするのでしょうか?
[ 親 93684 / □ Tree ] 返信 編集キー/

▲[ 93687 ] / ▼[ 93689 ]
■93688 / 4階層)  Re[4]: 「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ はまぐり (83回)-(2020/01/10(Fri) 10:42:43)
エンターキー連打しちゃったよね・・・

■No93686 (白熊 さん) に返信

Unable to send an email useSsl =false at local smtp server
https://github.com/jstedfast/MailKit/issues/709

> useSsl引数は、接続しているポートがSSLでラップされたポートかどうかを
> MailKitに通知するだけです。 SMTPの場合はポート465、IMAPの場合はポート993、
> POP3の場合はポート995。
> 
> プレーンテキストポートに接続するときにMailKitがSTARTTLSコマンドを使用しな
> いようにするには、次を使用する必要があります。
>
> client.Connect (host, port, SecureSocketOptions.None);

ということらしいです

[ 親 93684 / □ Tree ] 返信 編集キー/

▲[ 93688 ] / 返信無し
■93689 / 5階層)  Re[5]: 「SSL証明書の検証を無視させる」はなぜ必要ですか?
□投稿者/ 白熊 (3回)-(2020/01/10(Fri) 11:43:02)
No93688 (はまぐり さん) に返信
> エンターキー連打しちゃったよね・・・
>
> ■No93686 (白熊 さん) に返信
>
> Unable to send an email useSsl =false at local smtp server
> https://github.com/jstedfast/MailKit/issues/709
>
>>useSsl引数は、接続しているポートがSSLでラップされたポートかどうかを
>>MailKitに通知するだけです。 SMTPの場合はポート465、IMAPの場合はポート993、
>>POP3の場合はポート995。
>>
>>プレーンテキストポートに接続するときにMailKitがSTARTTLSコマンドを使用しな
>>いようにするには、次を使用する必要があります。
> >
>>client.Connect (host, port, SecureSocketOptions.None);
>
> ということらしいです
>

ありがとうございました!
疑問も晴れました!
解決済み
[ 親 93684 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -