|
.NET TIPS SSL通信で信頼されない証明書を回避するには?[C#、VB、2.0、3.0、3.5]デジタルアドバンテージ 一色 政彦2009/04/23 |
![]() |
|
|
|
.NETでは、WebClientクラス(System.Net名前空間)やWebRequestクラス(System.Net名前空間)でWeb上のリソースにアクセスでき(参考「TIPS:WebClientクラスでWebページを取得するには?」「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」)、これらのクラスはSSL(Secure Sockets Layer)でセキュリティ保護されたサイトへのアクセスもサポートしている。
しかし、そのSSLで使用されているデジタル証明書(以降、SSL証明書)が、信頼されないもの、例えば(VeriSignなどの第三者機関が発行したデジタル証明書ではなく)makecert.exeなどにより作成した自己証明書などである場合には、サイトのアクセス時に次のようなエラー(例外)が発生する。
本稿では、SSL証明書を変えずに、このエラーに対処する方法(エラーを回避してサイトにアクセスする方法)を紹介する。
信頼されないSSL証明書を回避する方法
このエラーに対処するには、SSL証明書の妥当性が検証される際に、「問題なし」と.NET Frameworkに認識させればよい。
これには、WebサーバのSSL証明書を検証する際に呼び出されるコールバック・メソッドを設定する機能を活用すればよい。これは.NET Framework 2.0で追加された機能で、独自のSSL証明書検証手順を組み込むためのものだ。
このコールバック・メソッドは、次の静的プロパティで設定する(ServicePointManagerはSystem.Net名前空間のクラス)。
- ServicePointManager.ServerCertificateValidationCallbackプロパティ
このプロパティに指定できるのは、RemoteCertificateValidationCallbackデリゲート型(System.Net.Security名前空間のクラス)のメソッドである。その型のメソッド・シグネチャは次のようになっている。
|
||
| RemoteCertificateValidationCallbackデリゲート型のメソッド・シグネチャ | ||
| 各パラメータの意味は以下のとおり。戻り値の意味は後述。 senderパラメータは、SSL通信を行っているオブジェクト(WebClientオブジェクトやWebRequestオブジェクト)。 certificateパラメータは、SSL証明書を示すオブジェクト。 chainパラメータは、証明機関のチェーンを示すオブジェクト。 sslPolicyErrorsパラメータは、SSL証明書に関連付けられたエラーを示すオブジェクト。 |
この戻り値がtrueの場合は、.NET Frameworkに対して「SSL証明書の使用は問題なし」を示し、falseの場合は「SSL証明書の使用は不可」を示す(各パラメータについては上記の説明欄を参照)。
従って、信頼されないSSL証明書であっても、戻り値としてtrueを返すようなコールバック・メソッドを作成すればよいというわけだ。具体的には次のようなコールバック・メソッドを実装すればよい。
|
||
| RemoteCertificateValidationCallbackデリゲートの実装例 | ||
| X509CertificateクラスやX509ChainクラスはSystem.Security.Cryptography.X509Certificates名前空間のクラス。 |
あとは、次のコードのように、これを先ほどのServicePointManager.ServerCertificateValidationCallbackプロパティに設定するだけだ。
|
||
| ServicePointManager.ServerCertificateValidationCallbackプロパティの設定 |
以上で対応は完了。SSL通信を行ってもエラーが発生しないはずだ。
なお、この方法ではすべてのSSL証明書を「SSL証明書の使用は問題なし」にしてしまうが、コールバック・メソッドのcertificateパラメータのX509Certificateオブジェクト(System.Security.Cryptography.X509Certificates名前空間)のSubjectプロパティでSSL証明書の識別名を文字列で受け取れるので、SSL証明書ごとに対応を変えるには、これを解析するなどすればよい。![]()
| 利用可能バージョン:.NET Framework 2.0以降 カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 使用ライブラリ:WebClientクラス(System.Net名前空間) 使用ライブラリ:WebRequestクラス(System.Net名前空間) 使用ライブラリ:ServicePointManagerクラス(System.Net名前空間のクラス) 使用ライブラリ:RemoteCertificateValidationCallbackデリゲート(System.Net.Security名前空間のクラス) 使用ライブラリ:X509Certificateクラス(System.Security.Cryptography.X509Certificates名前空間) 関連TIPS:WebClientクラスでWebページを取得するには? 関連TIPS:WebRequest/WebResponseクラスでWebページを取得するには? |
|
||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -




