質問: ◆環境 php 5.3.6 openssl 0.9.8 CentOS 5.5 あるssl通信をする処理で、phpの**fsockopen()** メソッドが使用されています。 この**fsockopen()**の第一引数に**fsockopen("ssl://hostname.com",~)**というふうに、 「**ssl://~**」のプロコトル指定があるのですが、この場合、SSL/TLSのバージョンはいくつで通信がされるのでしょうか? 自分の認識ですと、インストールされているOpenSSLが対応している最新のバージョンで通信が行われると思っているのですが、、、 拙い説明で申し訳ないですが、ご教授いただけると幸いです。
回答: SSL では通信を確立するハンドシェイクの時点で、利用可能な TLS バージョンを決定しています。 1. クライアントが(自身の処理できる最新の)バージョンを(ClientHello メッセージで)送る 2. サーバーが、自身が処理できるバージョンの中で、1. で受け取ったバージョンを超えないものを(ServerHello メッセージで)返す クライアントが SSL v2 を指定した場合、サーバーがいくら TLS v1.2 に対応していたとしても、SSL v2 で通信を確立しようとします(ただしサーバーで SSL v2 が有効な場合。有効でなければ、通信不可能となる) で、ssh:// では何になるかというと、クライアント側は openssl 0.9.8 なのであれば、TLS 1.0 までサポートのはずです。ですから TLS 1.0 での通信(バージョン 3.1)を試み、相手先のサーバーがこれに対応していれば(TLS 1.2 まで対応していたとしても) TLS 1.0 で、それより古いバージョンしか対応してなければ、その中で最も新しいバージョンでの通信となります。 ※ssh2 の場合、ClientHello でのバージョンを 2.0 として送ることで制限していると考えられます