|
サーバ間で重要なデータのやり取りを行う場合は、機密性(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 以降では静的にコンパイルされ組み込まれている必要がある。このため、レンタルサーバなどリコンパイルが望めない環境では利用できない。 そこで今回は、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 プロトコルをサポートしている。 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 を指定できるようになった。 Windows環境では、libeay32.dll および ssleay32.dll を PATH の通ったディレクトリ(一般的に \windows\system32\)に配置する必要がある。これらの dll は PHP のパッケージの dlls に含まれている。 次に、php.ini の extension=php_curl を有効にする。 PHP を再起動すれば、CURL関数群が利用できるようになる。 |
|
サンプル・プログラム |
|
| このプログラムは、CURL, Client URL Library 関数を使って、SSL 検証サイト https://www2.ggn.net/cgi-bin/ssl に接続するものである。 | |
サンプル・プログラムの解説 |
|
|
CURL, Client URL Library 関数の使い方は簡単である。
まず、関数 curl_init を使って cURL セッションを初期化する。戻り値はリソース ID である。 次に、関数 curl_setopt を使って、通信用の各種オプションを設定していく。 一般的には、CURLOPT_SSLVERSION,CURLOPT_HEADER,CURLOPT_RETURNTRANSFER の3つを指定する。 サーバ証明書の検証を求めてくるようなサイトに対しては、これをスキップするため、CURLOPT_SSL_VERIFYPEER, CURLOPT_SSL_VERIFYHOST の2つを FALSE にする。 関数 curl_exec によって SSL通信を実施し、戻ってきたテキスト(サイト・コンテンツ)を変数 $result で受け取り、画面に表示させる。
0010: $url = 'https://www2.ggn.net/cgi-bin/ssl'; //SSL検証サイト |
|
WebAPIとSSL通信 |
|
|
サーバ間通信では、引き数を GET/POST で渡し、戻り値を XML で受け取る、いわゆるWebAPI をとることが多い。 CURL, Client URL Library 関数は GET/POST 渡しを行うことも簡単である。 また、戻り値の XML は、DOM XML関数を使うか、SimpleXML で処理するなら関数 simplexml_load_string で $result を取り込めばいいだろう。 |
|
参考書籍 |
|
|
|
参考サイト |
|
(この項おわり)
|
|
|
|
|
2008年05月14日更新
写真と記事 (C)2008 studio pahoo
(※)本ページはリンクフリーですが、複製・転載時にはご一報ください。 |