[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 メーリングリストの案内