PHPセキュリティ対策:SSL通信を行う

(1/1)
サーバ間で重要なデータのやり取りを行う場合は、機密性(Confidentiality)完全性(Integrity) を確保するため、SSL通信*を用いることが多い。
今回は、PHP で SSL通信を行う方法を紹介する。

PHPでSSL通信を行う方法

PHP で SSL(https)通信を行うには、 fsockopen 、 fsockopen 、 fsockopen 、 fsockopen 、 fsockopen  といった関数を用いて実装できるのだが、いずれもラッパとして SSL通信がサポートされていることが前提だ。 fsockopen で、Registerd PHP Stream を使って確認することができる。。
SSL通信の場合、具体的には OpenSSL がインストールされている必要がある。PHP5 以降ではモジュール組み込みが可能だが、PHP 4.3.0 以降では静的にコンパイルされ組み込まれている必要がある。このため、レンタルサーバなどリコンパイルが望めない環境では利用できない。
space
そこで今回は、PHP4.x でもモジュールを追加するだけで SSL通信が可能になるCURL, Client URL Library 関数を利用することにする。

CURL関数の準備

CURL, Client URL Library 関数とは、Daniel Stenberg により開発されたライブラリ libcurl をサポー トする関数群である。PHP 4.0.2 で追加された。
libcurl は現在、http, https, ftp, gopher, telnet, dict, file, ldap プロトコルをサポートしている。
space
CURL関数を利用するには、--with-curl[=DIR] を付けて PHP をコンパイルしておく。ここで、DIR は、ディレクトリ lib および include を有するディレクトリの場所である。
ディレクトリ "include" には、"curl" という名前のフォルダがある必要があり、そのフォルダにはファイル easy.h および curl.h がある必要がある。また、libcurl.a という名前のファイルがディレクトリ "lib" にある必要がある。
PHP 4.3.0 以降では、URL ストリームで cURL を使用するよう PHP を 設定するために --with-curlwrappers を指定できるようになった。
space
Windows環境では、libeay32.dll および ssleay32.dll を PATH の通ったディレクトリ(一般的に \windows\system32\)に配置する必要がある。これらの dll は PHP のパッケージの dlls に含まれている。
space
次に、php.iniextension=php_curl を有効にする。
space
PHP を再起動すれば、CURL関数群が利用できるようになる。

サンプル・プログラム

このプログラムは、CURL, Client URL Library 関数を使って、SSL 検証サイト https://www2.ggn.net/cgi-bin/ssl に接続するものである。

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説

CURL, Client URL Library 関数の使い方は簡単である。
space
まず、関数  curl_init  を使って cURL セッションを初期化する。戻り値はリソース ID である。
space
次に、関数  curl_setopt  を使って、通信用の各種オプションを設定していく。
一般的には、CURLOPT_SSLVERSION,CURLOPT_HEADER,CURLOPT_RETURNTRANSFER の3つを指定する。
サーバ証明書の検証を求めてくるようなサイトに対しては、これをスキップするため、CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST の2つを FALSE にする。
space
関数  curl_exec  によって SSL通信を実施し、戻ってきたテキスト(サイト・コンテンツ)を変数 $result で受け取り、画面に表示させる。

0010: $url = 'https://www2.ggn.net/cgi-bin/ssl';          //SSL検証サイト
0011: 
0012: $ch = curl_init($url);
0013: curl_setopt($ch, CURLOPT_SSLVERSION, 3);
0014: curl_setopt($ch, CURLOPT_HEADER, FALSE);
0015: curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
0016: curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); //サーバ証明書検証をスキップ
0017: curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); //  〃
0018: $result = curl_exec($ch);
0019: curl_close($ch);

WebAPIとSSL通信

サーバ間通信では、引き数を GET/POST で渡し、戻り値を XML で受け取る、いわゆるWebAPI をとることが多い。
CURL, Client URL Library 関数は GET/POST 渡しを行うことも簡単である。
また、戻り値の XML は、DOM XML関数を使うか、SimpleXML で処理するなら関数  simplexml_load_string  で $result を取り込めばいいだろう。

参考書籍

  • 入門PHP セキュリティ」(クリス・シフレット/桑村潤/オライリー・ジャパン/オーム社/2006 年 05 月/1,890 円)
  • PHP辞典第2版」(西沢直木/翔泳社/2008 年 02 月/2,520 円)
  • PHP の薬箱」(佐久嶋ひろみ/九天社/2006 年 11 月/2,940 円)

参考サイト

(この項おわり)
header