[PHP-users 33495] Re: 証明書つきのhttpsのソケット通信
Michiyoshi Buniu
buniu @ dream-link.jp
2008年 4月 26日 (土) 16:13:30 JST
豊丹生です。
皆様色々とありがとうございました。
やっと解決しました。
一部、私が勘違いしている部分があったようで、ご迷惑おかけしました。
増田様が書かれている通り、結局、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 メーリングリストの案内