2008年4月26日

[PHP-users 33495] Re:証明書つきのhttpsのソケット通信

豊丹生です。

皆様色々とありがとうございました。

やっと解決しました。

一部、私が勘違いしている部分があったようで、ご迷惑おかけしました。

増田様が書かれている通り、結局、tls:// が必要でした。

最終的なスクリプトは以下の通りです。

$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', './client.pem');
stream_context_set_option($context, 'ssl', 'cafile', './ca.pem');

$fp = fsockopen('tls://サーバーIPアドレス', 14100, $errno, $errstr, 30,
$context);

$out = 'GET '.$purl['path'].' HTTP/1.0'."\r\n";
・・・(中略)・・・
$out .= "\r\n";
fwrite($fp, $out);

while (!feof($fp)) {
echo fgets($fp);
}

fclose($fp);

なお、contextを削除すると以下のエラーをはきますので、
リファレンスには載ってないですが、
ちゃんと第6引数も使われているようです。
SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL
routines:SSL3_READ_BYTES:sslv3 alert handshake failure

今思えば、件名がおかしかったと反省しております。

「fsockopenを使ったTLSクライアント認証について」などにすれば良かったと思っております。

色々とご返信頂き本当にありがとうございました。

----- Original Message -----
>> 困っているのは、証明書ではなく、SSLクライアント認証の部分です。
>>
>> 通常の証明書付きのSSL通信はfsockopenで問題なくできている状態です。
>
> 通常の SSL 通信は問題なくできました?
> 手元で試してみたのですが、
>
>>> $fp = fsockopen($purl['host'], (isset($purl['port']) ? $purl['port'] :
>>> 80),
>>> $errno, $errstr, 30, $context);
>
> これの第 6 引数の $context を削除して試したところ、
> このままではダメで、400 Bad Request が返ってきました。
>
> 第 1 引数を 'ssl://'.$purl['host'] に変えたらうまくいきました。
>
> 最初の質問にあった過去ログでも、'ssl://' が付いていたし、ssl:// (か
> tls://)
> かは必要だと思います。
> kanonbell さんも、
>
>> 動くにしてもただのTCP通信しかしてないんじゃないですか?
>
> と書かれてますね。
>
> ---
> 増田和悦


_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

投稿者 xml-rpc : 2008年4月26日 16:13
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/72585
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。