忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/17 14:50 |
PHP1-80:OpenSSL

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
<?php
    
    //暗号化する文字列
        $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は実行するたびに違う値になります。びっくりですね。


さて、暗号化復号化ができるのはわかったが、で、これでどうやってサーバ←→クライアント間を暗号化するんだ?

PR


2009/06/05 14:54 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
文字列の暗号化とサーバ←→クライアント間の暗号化はまったく別のレイヤのお話です。 単に文字列だけではなく、サーバからの応答それ自体を暗号化しないといけませんので、PHPで云々ではなくApacheの設定、httpd.confの編集が必要です。 XAMPPの場合、関連する内容毎に設定ファイルを分けてくれていますので、C:\\xampp\\apache\\conf\\extra\\httpd-ssl.confあたりがSSL関連の設定になります。 で、SSLCer...
弱小PHPerの憂鬱 | 2009/06/08 14:01

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-81:OpenSSL続き | HOME | PHP1-79:APCキャッシュの具体的使用法>>
忍者ブログ[PR]