« 今週のお買い物 (2004.11.14~11.20) | トップページ | ぴちぴちピッチ お楽しみ袋 »
2004.11.21
ここうさぎ、https対応作業中
OpenSSL を使えば、簡単に https 対応できると思ったら、そうでもないことが判明。いま、苦戦中です。
proxy を通さない場合は、サンプルプログラムの通りにやればいいんだろうけど、proxy 経由の https はサンプルが見つからないし。「OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―」という本が参考になるかな、と思ってアマゾンで買ってみたんだけど、私の知りたい情報が全く載ってません。orz
絶対、私以外にも OpenSSL で https クライアントを作ろうとしている人、作った人はいるはずなので、どこかでノウハウが公開されていてもよさそう。こういうとき、ソースコード検索エンジンがあれば、簡単に見つかるのかもしれません。
perl だと Net::SSLeay を使えば、たった数行で書けるようなのに。最悪、Net::SSLeay の該当部分を C に移植することになりそう。
私はOpenSSLの使い方が知りたくてこの本を購入したのですが、残念ながら、OpenSSLについては、それほど詳しくはありません。サンプルコードはOpenSSLとCによる物と、PureTLSとJAVAによるものが載っていますが、どちらも触り程度です。OpenSSLを利用してSSLを利用するためには、この本を片手にネットを調べまわる事になりそうです。
「OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―」の中でしきりに読むことを推奨している「マスタリングTCP/IP SSL/TLS編」も、あまり参考になりそうにない感じ。
ファイアウォールの内側から外側へアクセスするプログラムで OpenSSL を使ったものとして「stone」という例がありますが、ソースを見ても、私のやりたいことの参考になりそうなところは見つからず。探し方が悪いだけかもしれませんが。
投稿者: tsupo 2004.11.21 午前 10:34
| 固定リンク
|
|
| ![]()
|
|
アマゾンわくわく探検隊
トラックバック
この記事のトラックバックURL:
この記事へのトラックバック一覧です: ここうさぎ、https対応作業中:
» OpenSSL本 de ガックシ from びんよりぶろぐ
ここうさぎさんが購入されたOpenSSL本、私も買ったのですが、
個人的にはかなりガッカリしました。
ASN.1構造を扱うあたりとか、ハッシュ、公開鍵暗号... 続きを読む
コメント
http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=2895">http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=2895
をどうぞ。
「マスタリングTCP/IP SSL/TLS編」の
9.16 プロキシ
9.23 プロキシの CONNECT
でも触れられています。
投稿者: 68user (2004.11.21 午後 02:47)
こんにちは、BlogWrite担当です。
以下の文章が参考になるかと思いました。
http://www.cisnet.or.jp/home/tsuneoka/cgitech/3.html">http://www.cisnet.or.jp/home/tsuneoka/cgitech/3.html
個人的には、上記にあるように、WindowsAPI(WinINET)を利用しています。ですから、HTTPでもHTTPSでも基本的に意識せずに利用できています。
投稿者: BlogWrite担当 (2004.11.22 午前 01:51)
68userさん >
わざわざコメントありがとうございます。68userさんのソースを参考にさせてもらっています。今回教えていただいた部分は、Internet Explorer がどういうパケットを投げているのかを解析している過程でわかった(Net::SSLeay のソースも結局、同じことをやってました)んですが、SSL_connect() がどうしてもエラー(SSL_ERROR_SSL といういちばん原因のわかりにくいエラー)になってしまうので、ひょっとすると、OpenSSL の関数の中に proxy モード で connect するようなものはないかと探していたところでした。
結局、BlogWrite担当者さんに提示していただいたWebページに載っているプログラム例の中の
> const char *seed = "DHJSHD2HSDopHSFewqAJKAJKytFrJKAFuKytJAFJKAS4DFJ";
> RAND_seed(seed, strlen(seed));
> SSLeay_add_ssl_algorithms();
の3行が抜けていたのが SSL_connect() がうまくいかない原因っぽいです。
とりあえず、光が見えてきました。ありがとうございます。
BlogWrite担当さん >
「ここうさぎ」は Windows 以外でも動くように書いているので(まだ、Windows 用以外の make 環境を作ってませんが)、wininet は使わない方針です。wininet を使えば、割りと簡単に書けそうですね。機会があったら使ってみます。wininet は ftp クライアントを書くのに使ったことはあるんですが、それっきりになってます。
投稿者: tsupo (2004.11.22 午前 04:03)
SSL_connect() がうまくいかなかった(もしくは、うまくいったように見えつつ、その後 OpenSSLライブラリ内でクラッシュする)のは、『PRNG は「最低でもこれだけのサイズの種が必要」という量があり (OpenSSL 0.9.7c では 32 バイト)、それを下回っているとやはりエラーとなってしまう』のが原因のようでした。「種」を必要十分なものにすることで、うまく動くようになりました。
投稿者: tsupo (2004.11.24 午後 02:49)
ちなみに
> const char *seed = "DHJSHD2HSDopHSFewqAJKAJKytFrJKAFuKytJAFJKAS4DFJ";
> RAND_seed(seed, strlen(seed));
だと、3回に1回しかうまく動きませんでした(3回中、2回はクラッシュする)。
結局、
> unsigned short rand_ret;
>
> RAND_poll();
> while ( RAND_status() == 0 ) {
> rand_ret = (unsigned short)(rand() % 65536);
> RAND_seed( &rand_ret, sizeof ( rand_ret ) );
> }
で解決しました。
投稿者: tsupo (2004.11.24 午後 02:53)
依然として、SSL_connect() がうまくいくときといかないときがあります。ググってみると、結構、はまっている人が多いみたい。
どういうエラーかというと
> 3332:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s23_clnt.c:475:
というエラーが出ます。Windows のソケット特有の問題だとかいう説もあるようですが、真相は不明。
投稿者: tsupo (2004.11.24 午後 11:33)
あと ERR_print_errors_fp() ですが、Visual C++ のデバッグビルドで使うと落ちますね。リリースビルドだと問題なく動くんですが。(OpenSSL.org で配布してる Win32 用バイナリパッケージの場合)
投稿者: tsupo (2004.11.24 午後 11:35)
参考になると思います。
http://www21.ocn.ne.jp/~k-west/SSLandTLS/draft-luotonen-ssl-tunneling-03-Ja.txt
投稿者: sheepman (2004.11.29 午前 11:18)





