XAMPPには最初からOpenSSLが付属しているので、簡単にオレオレ証明書を作成できます。
SSLで暗号化通信をするためには暗号化キーの受け渡しが必要ですが、その暗号化キー自体が本当に正しいものなのかどうかは、それ自身だけではわかりません。
サーバが正しい鍵を送信したつもりでも、途中で不正な鍵にすり替えられてクライアントに届き、それを使って暗号化したつもりが覗かれ放題、という可能性があるからです。
それを防ぐため、サーバではベリサインなどの"信用できる"認証局から証明書を発行してもらい、それを自分の証明書に組み合わせて新しい暗号化キーを作ります。
ブラウザ側では、その鍵にベリサインなどの"信用できる"証明書が含まれていればその証明書は正しいと判断します。
まあ↑の説明は端折りすぎて正しくないので知ったかしないように。私のことですかそうですか。
そんなわけで個人情報の厳重な取り扱いが必要な企業などでは正しい証明書を発行するべきですが、個人でテストするレベルではそんな必要もないでしょう。
第一種または第四種オレオレ証明書となるでしょう。
さくっとやってみます。
C:\xampp\apache\bin>openssl version
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
OpenSSL 0.9.8i 15 Sep 2008
いやあ……なんだそれ?
$res=openssl_pkey_new();
print($res);
bool(false)
あるぇー?
というわけで証明書を作成してくれるバッチファイルが提供されています。
デフォルトだとここらへんにあると思われます。
C:\xampp\apache\makecert.bat
コマンドプロンプトから実行して質問に適当に答えていくと、自動的に暗号化キーが作成されます。
C:\xampp\apache\conf\ssl.crt\server.crtが公開鍵、C:\xampp\apache\conf\ssl.key\server.keyが秘密鍵となります。
無かったら適当にそこら辺を探してください。
鍵のペアができましたので、とりあえず暗号化してみます。
encrypt_decrypt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//暗号化する文字列
$str='あいうえお';
//公開鍵
$key_public=file_get_contents('C:\xampp\apache\conf\ssl.crt\server.crt');
//秘密鍵
$key_private=file_get_contents('C:\xampp\apache\conf\ssl.key\server.key');
//暗号化
$ret=openssl_public_encrypt($str,$str_encrypt,$key_public);
if($ret===false){print_openssl_error();}
//復号化
$ret=openssl_private_decrypt($str_encrypt,$str_decrypt,$key_private);
if($ret===false){print_openssl_error();}
//確認
print("<html><pre>");var_dump($str,$str_encrypt,$str_decrypt);die();
//失敗したときにエラーログを拾う関数
function print_openssl_error(){
while($msg = openssl_error_string()){
print($msg.'<br />');
}
} |
$strと$str_decryptが同じになり、無事に復号化できました。
ちなみに$str_encryptは実行するたびに違う値になります。びっくりですね。
さて、暗号化復号化ができるのはわかったが、で、これでどうやってサーバ←→クライアント間を暗号化するんだ?