.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証明書が問題でエラーが発生した例
WebException.Messageプロパティの内容は「基礎になる接続が閉じられました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした」となっている(上図)。
また、WebException.InnerException.Messageプロパティの内容は「検証プロシージャによると、リモート証明書は無効です。」となっている(下図)。
例外は「System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)」で発生している。
本稿では、SSL証明書を変えずに、このエラーに対処する方法(エラーを回避してサイトにアクセスする方法)を紹介する。
信頼されないSSL証明書を回避する方法
このエラーに対処するには、SSL証明書の妥当性が検証される際に、「問題なし」と.NET Frameworkに認識させればよい。
これには、WebサーバのSSL証明書を検証する際に呼び出されるコールバック・メソッドを設定する機能を活用すればよい。これは.NET Framework 2.0で追加された機能で、独自のSSL証明書検証手順を組み込むためのものだ。
このコールバック・メソッドは、次の静的プロパティで設定する(ServicePointManagerはSystem.Net名前空間のクラス)。
- ServicePointManager.ServerCertificateValidationCallbackプロパティ
このプロパティに指定できるのは、RemoteCertificateValidationCallbackデリゲート型(System.Net.Security名前空間のクラス)のメソッドである。その型のメソッド・シグネチャは次のようになっている。
public delegate bool RemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors
)
Public Delegate Function RemoteCertificateValidationCallback( _
sender As Object, _
certificate As X509Certificate, _
chain As X509Chain, _
sslPolicyErrors As SslPolicyErrors _
) As Boolean
各パラメータの意味は以下のとおり。戻り値の意味は後述。
senderパラメータは、SSL通信を行っているオブジェクト(WebClientオブジェクトやWebRequestオブジェクト)。
certificateパラメータは、SSL証明書を示すオブジェクト。
chainパラメータは、証明機関のチェーンを示すオブジェクト。
sslPolicyErrorsパラメータは、SSL証明書に関連付けられたエラーを示すオブジェクト。
この戻り値がtrueの場合は、.NET Frameworkに対して「SSL証明書の使用は問題なし」を示し、falseの場合は「SSL証明書の使用は不可」を示す(各パラメータについては上記の説明欄を参照)。
Copyright© Digital Advantage Corp. All Rights Reserved.