tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル証明書ファイル
記事No16478
投稿日: 2019/06/11(Tue) 16:17
投稿者でふぁ
おせわになります。
とあるサイトに、dim objIE as New InternetExplorer にて
接続して、情報のやりとりとしています。
外部IEとして起動して、そこから、getelementで情報を取得したり
インプットしたりです。
その処理はうまく行ってるのですが
先方より、証明書ファイルを頂き(crt,key)、これを利用すると
取得できる情報が多くなるというお話がありました。

そこで質問です。
プログラム中で、このファイルはどのように指定するか
わかりますでしょうか。

または、単独でIEを起動して、この証明書ファイルをインストール
すると、vb6プログラム中でも利用できるようになるのでしょうか

その他、フォーム内部のWEBBroserでもかまいませんので
何かヒントでもあれば幸いです。

[ツリー表示へ]
タイトルRe: 証明書ファイル
記事No16482
投稿日: 2019/06/13(Thu) 13:21
投稿者魔界の仮面弁士
> 先方より、証明書ファイルを頂き(crt,key)、

それはバイナリファイルでしょうか?

それともメモ帳で開けるテキストファイルでしょうか?
「-----BEGIN CERTIFICATE-----」〜「-----END CERTIFICATE-----」とか
「-----BEGIN RSA PRIVATE KEY-----」〜「-----END RSA PRIVATE KEY-----」とか…。


名前からすると、crt は公開鍵(証明書)っぽい気もします。

key の方は…秘密鍵っぽい名前ですね。
あるいは PKCS#12 インポート用のパスフレーズかも知れません。


> これを利用すると
> 取得できる情報が多くなるというお話がありました。

現状、Internet Explorer からの閲覧時に
クライアント証明書を指定できる環境になっていますか?

サーバー側で、クライアントの SSL 証明書を要求するよう設定されている場合、
ユーザーが Internet Explorer からそのサイトにアクセスすると、
SSL 証明書を選択するためのウィンドウが表示されるかと思います。
(証明書が一つだけの場合は、自動的に選択されるかも)

有効な証明書が選択肢にない場合には、Internet Explorer のメニューから
[ツール]-[インターネット オプション]を開き、
[コンテンツ]タブから証明書をインポートしておいてください。


> プログラム中で、このファイルはどのように指定するか
> わかりますでしょうか。

InternetExplorer の Navigate2 を呼び出す際に
クライアント証明書を選択する画面が表示されるかと思いますが、
コードから明示的に指定する方法が存在するかどうかは調べていません。


IE のように JavaScript の実行や、HTML DOM への加工を行えなくても良いのなら、
InternetExplorer オブジェクト以外の方法を選択する道も考えられます。

たとえば ServerXMLHTTP での通信に切り替えて
 'cn = "LOCAL_MACHINE\My\ストア内の名前"
 'cn = "C:\Foo\証明書ファイルへのフルパス"
 Set x = New ServerXMLHTTP
 x.setOption SXH_OPTION_SELECT_CLIENT_SSL_CERT, cn
 x.open "GET", "https://example.com", False
 x.send
などとすることで、コードから直接指定できそうです。未検証ですが。


追加でこのあたりも紹介しておきます。
今回の質問に直接関係する話ではありませんが、関連情報として。
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=16149

[ツリー表示へ]
タイトルRe^2: 証明書ファイル
記事No16485
投稿日: 2019/06/18(Tue) 15:33
投稿者でふぁ
魔界の仮面弁士 様 いつもお世話になっております。
頂いたリンク先、自分です。(;´∀`)
その節は大変おせわになりました。
と思ったら「おなまえ」抜けていましたね。すみません。

こちらの話ですが。
>それともメモ帳で開けるテキストファイルでしょうか?
>「-----BEGIN CERTIFICATE-----」〜「-----END CERTIFICATE-----」とか
>「-----BEGIN RSA PRIVATE KEY-----」〜「-----END RSA PRIVATE KEY-----」とか…。
ご指摘のように、テキストファイルです。

>現状、Internet Explorer からの閲覧時に
>クライアント証明書を指定できる環境になっていますか?
選択画面というのは、例えば
銀行のサイトにアクセスすると出てくる「認証用の証明書を、、」の画面でしょうか
対処としているサイトはクライアント証明書がなくてもアクセスできるサイトなので、
選択画面は出てこないです。

>[コンテンツ]タブから証明書をインポートしておいてください
一応、インポートしておきました
ひょっとしたらこれだけでいいのですか?

そのサイトで証明書をプログラム内で使う例として
phpの例があり
  curl_setopt($ch, CURLOPT_SSLCERT, '証明書のパスを指定');
  curl_setopt($ch, CURLOPT_SSLKEY, '秘密鍵のパスをを指定');
これをVB6でできないのかなと考えた次第です
というか、この例で、どこのサイトがバレバレですね(;´∀`)

さらにお聞きしたいのですが
ServerXMLHTTPの通信と、objIEの通信を同一セッション?にする方法ってありますか
htmlページ情報のやりとりはobjIEで行って
必要な時に、ServerXMLHTTPを使うといった感じです。

[ツリー表示へ]
タイトルRe^3: 証明書ファイル
記事No16486
投稿日: 2019/06/19(Wed) 16:39
投稿者魔界の仮面弁士
> 選択画面というのは、例えば
> 銀行のサイトにアクセスすると出てくる「認証用の証明書を、、」の画面でしょうか
> 対処としているサイトはクライアント証明書がなくてもアクセスできるサイトなので、
> 選択画面は出てこないです。

選択画面が表示されるかはサイト次第ですね。サーバー側の設定で、
 ・クライアント証明書を無視する(証明書がそもそも要求されない)
 ・クライアント証明書を受理する(証明書が無くてもアクセスできる)
 ・クライアント証明書を要求する(証明書がないとアクセスできない)
の 3 パターンがありますので、それによってブラウザ側の振る舞いも変わってくるでしょう。
(子細はサイト管理者にお問い合わせください)

また、複数の証明書がある場合、どれを選択するのかをユーザーに選択させるのか、
それともプログラムから固定的に指定するのかという点も検討が必要かも知れません。

ちなみに証明書をもとにアクセス権が決定されるシステムの場合、サーバーの振る舞いとしては
 証明書の有無のみが判断され、内容は問わずに同じ権限として扱われるケース
 証明書のフィンガープリントが個別にチェックされてアクセス権が定まるケース
 証明書のサブジェクト(O や OU など)の文字列などを正規表現判定するなどして判断するケース
などがあります。


> phpの例があり
>   curl_setopt($ch, CURLOPT_SSLCERT, '証明書のパスを指定');
>   curl_setopt($ch, CURLOPT_SSLKEY, '秘密鍵のパスをを指定');
> これをVB6でできないのかなと考えた次第です

Win10 v1803 以降ならば、curl コマンドが利用可能です。
その場合は、--key オプションで秘密鍵のパス、
-E あるいは --cert オプションで証明書を指定することができます。


しかし先に述べた通り、AcitveX の InternetExplorer オブジェクトに対して、
証明書と秘密鍵を渡す方法があるかどうかは分からないです。


.NET Framework の場合であれば、単純に
 .ClientCertificates.Add( X509Certificate2インスタンス )
とするだけで済むのですけれどね。


> さらにお聞きしたいのですが
> ServerXMLHTTPの通信と、objIEの通信を同一セッション?にする方法ってありますか

どうでしょうね。仮にそれが出来てしまうと、別アプリから
既存のセッションを乗っ取れてしまうことにもなりそうで怖い気がするのですが。

もしかしたら、IE 上の JavaScript から、XMLHTTP / ServerXMLHTTP を呼び出した場合に、
セッションが引き継がれるかも知れません。調べていませんけど。


仮にそのセッションが、Cookie 管理されているだけのものであれば、
ServerXMLHTTP の setRequestHeader メソッドや、
InternetExplorer の Navigate2 メソッドの第 4 引数にて
"Cookie: 〜" ヘッダーを付与するという手はありそうです。
今回の目的には合わなさそうですけれども。

なお、現在の Cookie を得る方法としては、
ServerXMLHTTP なら getResponseHeader メソッドがあります。
InternetExplorer 側からなら、.document.cookie を使う方法か、
あるいは InternetGetCookie API を使う方法がありますが…これは有効期限のある
永続的 Cookie のためのもので、揮発性 Cookie は取得できないので、
今回の要件では出番はないかも。

[ツリー表示へ]