お世話になります。
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などが怪しそうです
> [-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
'==================
魔界の仮面弁士 様、いつもお世話になっております。
お返事感謝いたします。
さっそく実行したところ今度は
[-2147012858 The host name in the certificate is invalid or does not match]というエラーになってしまいました。
まる24時間webを検索したのですが、有益な資料がないので
再度質問させていただきました。
また、上記コードの最下行 = flag or SslErrorFlag,,,行ですが
or の用例がわかりません。
よろしくお願いします
> [-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
のようにして判断できます。
お世話になりました。
どうやら最初のお答えよかったです。
横着してプログラムのトップにsslIgnoreFlagの設定をしていたため
肝心のwinHTTP.Sendの前ではフラグが有効になっていなかったようです。
直前できちんと処理したら見事に機能いたしました。
さらにピットフラグのご解説、得した気分です。
まさかVB6で使えるとは思っても見ませんでした。。。
重ね重ね感謝いたします
ツイート | ![]() |