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

解決


デファイアント  2008-01-30 02:35:16  No: 100150

お世話になります。
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-30 03:39:05  No: 100151

> [-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 10:47:09  No: 100152

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

よろしくお願いします


魔界の仮面弁士  2008-01-31 21:56:56  No: 100153

> [-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-02-01 08:06:51  No: 100154

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

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

重ね重ね感謝いたします


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加