■ winhttpオプジェクトから、sslアクセス

[Visual Basic Q & A 掲示板] [過去ログの一覧]


デファイアント 2008/01/29(火) 17:35:16
お世話になります。
vb6から、web処理を自動化するプログラムを作成しております
基本的には
Dim winHTTP As Object
Set winHTTP = Cr
eateObject("WinHttp.WinHttpRequest.5.1")
winHTTP.Open "GET", URL, False
という流れでhttpをオープンしています。

http通信を参照するために、proxyとしてburpなるツールを利用していますが
SSLサイトとやりとりすると
vb側より
[-2147012851:The certificate authority is invalid or incorrect]
というエラーが発生します。
おそらくブラウザでいう所の「証明書エラー:ナビゲーションはブロックサされました」と同じ状況だと思いますが、

ブラウザでは、「このサイトの閲覧を続行する」で対処できるのですが
プログラムでは先に進む方法がわかりません。
おそらくwihttpのオプション設定だと思いますが、
おわかりになりますでしょうか

WinHttpRequestOption_EnableHttpsToHttpRedirectsとか
WinHttpRequestOption_EnableHttpsToHttpRedirectsなどが怪しそうです

魔界の仮面弁士 2008/01/29(火) 18:39:05 <常連>
> [-2147012851:The certificate authority is invalid or incorrect]

エラーの内容からすると、certificate authority (CA:認証局) すなわち 
証明書の発行元が無効(未登録または信頼されていない)とのことなので、
 (案1) 信頼されたCA(VeriSign 等)の証明書を使うよう、サイト管理者に依頼する。
 (案2) アプリの実行環境に、そのCAを信頼済みとして登録しておく。
のいずれかの作業を行っておけば、エラーは出なくなるかと思います。


環境側の修正は行わず、信頼のおけない証明書をそのまま受け入ることを
プログラム的に許容するのであれば、WinHttp.Send の直前に、
下記のコードを実行してみてください。

'==================
Const WinHttpRequestOption_SslErrorIgnoreFlags As Long = &H4&
Const SslErrorFlag_UnknownCA As Long = &H100&

'SSLエラーを無視するかどうかを決めるフラグ。
'初期値は0(エラーを無視しない)。
Dim flag As Long
flag = WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags)

'「信頼されていないCA(認証局)」のSSLエラーを無視する。
WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = flag Or SslErrorFlag_UnknownCA
'==================

デファイアント 2008/01/31(木) 01:47:09
魔界の仮面弁士 様、いつもお世話になっております。
お返事感謝いたします。
さっそく実行したところ今度は
[-2147012858 The host name in the certificate is invalid or does not match]というエラーになってしまいました。
まる24時間webを検索したのですが、有益な資料がないので
再度質問させていただきました。
また、上記コードの最下行 = flag or SslErrorFlag,,,行ですが
or の用例がわかりません。

よろしくお願いします

魔界の仮面弁士 2008/01/31(木) 12:56:56 <常連>
> [-2147012858 The host name in the certificate is invalid or does not match]

エラーメッセージのとおりですが、細かい説明を端折って書くと、要するに
URL のサーバ名と証明書のサイト名が一致していなかった、という意味です。

たとえば、verisign のサイトに、https://www.verisign.co.jp/ ではなく、IP 指定の
https://211.133.252.101/ でアクセスした場合に、CN(Common Name)が不一致ということで
セキュリティの警告が出ますよね。それがエラーとなって表れているわけです。

あるいは、そもそも別サーバ向けに発行された証明書なのに、それを偽って
別サーバで流用している場合にも、同じエラーとなります。


> というエラーになってしまいました。
サイト名の偽証は、詐欺サイトと誤解を受けても文句が言えないところなので、本来は
プログラム側で「無視」するのではなく、サーバ自体の設定を見直すべきなのですけれどね…。


> まる24時間webを検索したのですが
WinHttpRequest オブジェクトの仕様なら、まずは SDK を見ると良いですよ。
http://msdn2.microsoft.com/en-us/library/aa384106%28VS.85%29.aspx


で。今回の場合は、先に指定した SslErrorFlag_UnknownCA だけでなく、
SslErrorFlag_CertCNInvalid のフラグ( = &H1000&)も、一緒に指定してやれば OK です。

このフラグは、「Common Name が違っていた場合のエラー」を表しますので、
先のサンプルのように、WinHttpRequestOption_SslErrorIgnoreFlags オプションに
渡すと、SSLエラーを「無視(Igonre)」指定するという意味になります。


> or の用例がわかりません。
いわゆる「ビットフラグ」と呼ばれるものですが、その言葉の意味は分かりますか?

使い方としては、追加したいフラグが 2 つあるなら
 flag = WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags)
 flag = flag Or ビットフラグ1
 flag = flag Or ビットフラグ2
 WinHttp.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = flag
のように書きます。

逆に、既に指定済みのフラグを解除したいなら、Or で繋ぐかわりに
 flag = flag And Not ビットフラグ
のように書けば OK です。

また、特定のフラグが指定されているかどうかを判断するには、
 If (flag And ビットフラグ) = 0 Then
  MsgBox "指定されていない"
 Else
  MsgBox "指定されている"
 End If
のようにして判断できます。

デファイアント 2008/01/31(木) 23:06:51 <中級者>
[[解決]]

お世話になりました。
どうやら最初のお答えよかったです。
横着してプログラムのトップにsslIgnoreFlagの設定をしていたため
肝心のwinHTTP.Sendの前ではフラグが有効になっていなかったようです。
直前できちんと処理したら見事に機能いたしました。

さらにピットフラグのご解説、得した気分です。
まさかVB6で使えるとは思っても見ませんでした。。。

重ね重ね感謝いたします

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library