https通信で不正な証明書のエラーを回避するには?

解決


ぺりかん  2005-05-12 09:41:54  No: 89763

質問させていただきます。

XMLHTTP30を利用してXML文書のhttpsへのpost送信を行っています。
本番機では正式な証明書が発行されているため問題なく通信できるのですが、
開発用のWebサーバの証明書が不正なため、Send時にエラーになってしまいます。
WinInetを利用すると、証明書の不正エラー時、フラグにSECURITY_FLAG_IGNORE_UNKNOWN_CAを設定して
再送信させる…といったようなことができると思うのですが、
XMLHTTPで同じようなことが実現できないでしょうか?
何か解決法があれば教えていただきたいです。
お願いします。


魔界の仮面弁士  2005-05-12 20:56:23  No: 89764

> 開発用のWebサーバの証明書が不正なため、Send時にエラーになってしまいます。
仮証明書で対応できませんか?
発行元のエラーなら、「信頼されている機関」にしてしまえば良いですし、
サーバ名の違いによるエラーなら、hostsファイルで別名を定義できますよね。
http://www.atmarkit.co.jp/fwin2k/win2ktips/442hostsfile/hostsfile.html

> フラグにSECURITY_FLAG_IGNORE_UNKNOWN_CAを設定して
そのような利用には、XMLHTTPではなく、ServerXMLHTTP を使います。
setOptionメソッドを利用して、
  Dim V As SXH_SERVER_CERT_OPTION
  V = 任意のパラメータ
  .setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, V
という感じでしょうか。


ぺりかん  2005-05-13 10:30:35  No: 89765

魔界の仮面弁士様、お返事ありがとうございます。

>仮証明書で対応できませんか?
>発行元のエラーなら、「信頼されている機関」にしてしまえば良いですし、
>サーバ名の違いによるエラーなら、hostsファイルで別名を定義できますよね。
証明書を「信頼された発行元」にしたり、
root証明書をつくって「信頼された証明機関」にいれたりしたのですが、
エラーがでてしまいます。
hostsファイルで別名を定義するというのは試していなかったので、
やってみましたが、だめでした。
やはり証明書そのものに問題があるのだと思います。

>そのような利用には、XMLHTTPではなく、ServerXMLHTTP を使います。
ServerXMLHTTPの利用も考えてみたのですが、
プロキシの設定が必要というのがどこかに書いてあったため、
クライアントサイドには向かないかなと思いXMLHTTPを選択しました。
XMLHTTPのようにプロキシの設定をIEの設定に自動で合わせる…
というようなこともできるのでしょうか?
質問ばかりで申し訳ありません。


魔界の仮面弁士  2005-05-13 12:59:53  No: 89766

> やはり証明書そのものに問題があるのだと思います。
証明書のエラーって、
  「有効期限が切れている」
  「証明書にあるホスト名と、実際のホスト名が異なる」
  「発行元が信頼された機関ではない」
のいずれか(あるいはこれらの組み合わせ)ですよね。
IE等でそのURLにアクセスした場合、どのエラーになるのでしょうか?

> ServerXMLHTTPの利用も考えてみたのですが、
> プロキシの設定が必要というのがどこかに書いてあったため、
その「どこか」とは、
http://support.microsoft.com/kb/289481/JA/
の事でしょうか?

ServerXMLHTTP自体は、「プロキシ無し」の状態でも動作しますよ。
# 少なくとも当方では、MSXML3, MSXML4, MSXML5 のいずれにおいても、
# proxycfg等の設定をせずに、通信が出来ていますし。(Win2000,WinXPにて)

> XMLHTTPのようにプロキシの設定をIEの設定に自動で合わせる…
設定には、コマンドラインツール proxycfg を使う事ができます。
特に指定していなければ、プロキシ無しの状態「proxycfg -d」ですが、
IEの手動設定を取り込みたいのであれば、「proxycfg -u」コマンドが使えます。


ぺりかん  2005-05-14 10:06:54  No: 89767

魔界の仮面弁士さま、お返事ありがとうございます。

>IE等でそのURLにアクセスした場合、どのエラーになるのでしょうか?
エラーは「証明書にあるホスト名と、実際のホスト名が異なる」エラーと
「発行元が信頼された機関ではない」エラーです。
証明書をローカルにファイルコピーして開くと、証明書の情報欄に
「情報不足のため、この証明書を検証できません」と表示されます。

>ServerXMLHTTP自体は、「プロキシ無し」の状態でも動作しますよ。
># 少なくとも当方では、MSXML3, MSXML4, MSXML5 のいずれにおいても、
># proxycfg等の設定をせずに、通信が出来ていますし。(Win2000,WinXPにて)
proxycfgを実行すると「直接アクセス(プロキシサーバーなし)」となるので
本来なら通信可能ということでしょうか?
試しにServerXMLHTTP40を使ってみると、「サーバー名もしくはアドレスが
解決できない」エラーがでてしまいます。
使っているPC(というか環境)の問題でしょうか?

証明書を認証できればそれが一番なのですが…。


魔界の仮面弁士  2005-05-14 19:31:59  No: 89768

> 本来なら通信可能ということでしょうか?

どうにか、「警告の出る証明書」を持つページを見つけたので、
実験用のコードを書いてみました。下記のコードは動作しますか?

Option Explicit

Private Const URL As String = "https://www.kaz-ishihara.com/frend/miyaoka.shtml"

Private Sub Form_Load()
    Check1.Caption = "証明書を無視"
    Check1.Value = vbUnchecked
End Sub

Private Sub Command1_Click()
    Dim X As MSXML2.ServerXMLHTTP30
    Set X = New MSXML2.ServerXMLHTTP30
    If Check1.Value = vbChecked Then
        X.setOption _
            SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
            SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
    End If
    X.open "GET", URL, False
    On Error Resume Next
    X.send
    If Err.Number = 0 Then
        MsgBox X.responseText(), vbInformation
    Else
        MsgBox Err.Description, vbExclamation
    End If
    Set X = Nothing
End Sub


ぺりかん  2005-05-15 10:49:24  No: 89769

魔界の仮面弁士さま、ありがとうございます。
実験用コードまで用意していただいて…お手間をおかけして申し訳ありません。

実験用コードですが、やはりSend時に同様のエラーが発生しました。
現在の開発環境はLANの設定に自動構成スクリプトを使用するようになって
いるため、そういったことが影響しているのではないかと考えております。
#ネットワークにあまり精通していないため、的外れなことを言っていたらすみません。

あまり時間もないため、今回は通信部分のみWinInetで実現しようかと考えています。
認証部分はそれで回避できそうなので。
サーバーにデータ(XML文書をURLエンコードした文字列データ)を送信し、
その結果としてサーバーが送信したデータ(XMLHTTPではResponseTextで受信可能なもの)
を受信することがWinInetで代用可能と認識しておりますが、
何か不都合はありますでしょうか?
(模索しながらの開発のため、認証部分をクリアできるところまでしか
まだ実際には試しておりません。)

それから、不正証明書の件でもうひとつだけ質問させてください。
「信頼された機関ではない」エラーの回避はWinInetでは問題ないのですが、
「ホスト名が違う」エラーにまだ問題があります。
証明書の発行元にIPアドレスの形式の名称がついているのです。
前回の書き込み時は、それがサーバーのIPアドレスと考えていたため、hostsファイルに

xxx.xx.x.xx                  xxxxx.co.jp
↑                            ↑
IPアドレス形式の発行元名称    本来のホスト名称

のような形で記述していました。
その後調べたところ、サーバーのIPアドレスは発行元名称のものとは
まったく違っていることに気付きました。
この場合、IPアドレスのような形式で書かれた発行元では
hostsファイルで名前解決するということは無理ではないでしょうか?
一応以下のようにhostsファイルに書いて試してもみたのですが、
エラー回避できませんでした。

xxx.xxx.xx.xxx      xxx.xx.x.xx                  xxxxx.co.jp
↑                  ↑                            ↑
本当のIPアドレス    IPアドレス形式の発行元名称    本来のホスト名称

これはもうサーバー側に証明書を正してもらうしかないと思っています。
それとも何か解決法がありますでしょうか?


ぺりかん  2005-05-15 10:51:57  No: 89770

すみません。追加記述です。
矢印の位置が若干ずれてしまいました。
分かりますでしょうか?申し訳ありません。


魔界の仮面弁士  2005-05-17 06:42:34  No: 89771

> それとも何か解決法がありますでしょうか?
う〜ん。解決策はわからないです。すみません。m(_ _)m

当方で経験した事の無い状況ですし、状況を再現できる環境も無いので、
私ではお力にはなれないかと。


ぺりかん  2005-05-17 09:21:14  No: 89772

魔界の仮面弁士さま、いろいろありがとうございました。

「ホスト名が違う」エラーもWinInetはフラグをセットすることで回避できました!
サーバーから送られてくるデータも無事受信できたので解決とさせていただきます。
本当に長々とすみませんでした。
また何かあった際は、お世話になることもあるかと思いますが、
よろしくお願いいたします。


AZUKI  2006-08-17 20:30:15  No: 89773

飛び入り参加でレスさせてもらいます。

恐らくぺりかんさんと魔界の仮面弁士さんの動作結果の差は
Windows2003Serverのバージョンの差じゃないかと。

ぺりかんさん>SP1あたってる環境
魔界の仮面弁士さん>SP1あたっていない環境

なのでは?どうでしょう。
私もこの問題でかなり悩んでいます。


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

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






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