自己署名証明書でテスト環境構築その他諸々(何)
構築する、放置する、分からなくなる、構築する、放置する、分からなくなる(以下略)を繰り返していた(謎)ので、今度こそメモに残すらしい。
自己署名証明書の作成
これは単にコマンドを叩くだけ。
openssl req -new -days 365 -x509 -nodes -keyout key.pem -out cert.pem openssl req -config path_to_openssl.cnf -new -days 365 -x509 -nodes -keyout key.pem -out cert.pem
特にWindows環境では、「Unable to load config info from /usr/local/ssl/openssl.cnf」とか言われるので、設定ファイルの場所をしっかり指定してやる必要がある。
以下のような感じで入力していくと、自己署名証明書が完成。
Loading 'screen' into random state - done Generating a 1024 bit RSA private key ........++++++ ......++++++ writing new private key to 'key.pem'
-
-
-
- -
-
-
-
-
-
- -
-
-
本当はちゃんとしたCAに要求して‥ってやりたいんだけど、それは機会があったときに(謎)。
ダミーホスト名の設定
ローカルでテストする分には別になくてもいいし、HTTPSの方にとっては意味がないのだが、あると便利なことがあるのでついでに書いておく。
それぞれ以下のファイルを編集する。
追加する内容は以下のような感じ。
127.0.0.1 a.example.com 127.0.0.1 b.example.com 127.0.0.1 c.example.com :
Apache httpdの設定
とりあえず、手元に既に入っているApache 2.2.16 (on Windows Vista)を使用する。(このApacheは、SSLに関してはこれまでに何も設定していないはずなので、必要な編集内容は網羅できるはず)
最低限編集する必要があるファイルは以下の2つ。
conf/httpd.conf
以下の2行のコメントアウトをはずせばOK。
: LoadModule ssl_module modules/mod_ssl.so : : # Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf :
conf/extra/httpd-ssl.conf
VirtualHostタグの中を編集していくのだが、DocumentRootの設定とかは分かりきっているし、とりあえず動かすことはできるので割愛。
HTTPS対応するにあたって一番重要なのは、先に作った自己署名証明書を指定する設定。
: # Server Certificate: : SSLCertificateFile "C:/path/to/Apache2.2/conf/server.crt" #SSLCertificateFile "C:/path/to/Apache2.2/conf/server-dsa.crt" # Server Private Key: : SSLCertificateKeyFile "C:/path/to/Apache2.2/conf/server.key" #SSLCertificateKeyFile "C:/path/to/Apache2.2/conf/server-dsa.key" :
この設定を編集してもいいのだが、この設定に合うように自己署名証明書のファイルを配置したほうが楽かも。
> move cert.pem C:\path\to\Apache2.2\conf\server.crt > move key.pem C:\path\to\Apache2.2\conf\server.key
あとはApache httpdを再起動すれば、(自己署名なので認証されていませんって怒られるけど)HTTPSでのアクセステストはできるようになる。
PHPでHTTPかHTTPSかを見分ける
HTTPSでのアクセスの場合には、「$_SERVER['HTTPS']」に値がセットされるらしい。
<?php if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { echo 'HTTP over SSL!'; } else { echo 'plain HTTP'; }
URIスキームを省略する
特に動的なページ生成を行うサイトだと、スタイルシートとか画像ファイル(特にヘッダやフッタなど)とかJavaScriptファイルとか、共通的なものはどこかのファイルにlinkタグやimgタグやscriptタグなどを書いておき、そのファイルをインクルードする、というのはよくやる手法。
そのサイトの中に、HTTPやHTTPSでアクセスさせるページが混在していると、共通ファイルに書くURIに困るときがある。
というのは、「http://〜」と書くとHTTPSでアクセスさせるページで「一部しか暗号化されていません」って怒られるし、「https://〜」と書くとその部分だけ毎回HTTPSでアクセスしちゃうし、ということが起こりうる。特にGoogleなんかで公開されているjQueryスクリプトファイルをそのまま使うときなど。
上記のようなプログラムでの切り替えができればいいが、他にいい方法はないものかとGoogleのページのソースを眺めていたら、以下のような書き方ができるらしい。
<html> <head> <script type="text/javascript" src="//a.example.com/hogehoge.js"></script> <link type="text/css" rel="stylesheet" href="//a.example.com/hogehoge.css" /> </head> <body> <img src="//a.example.com/hogehoge.png" /> </body> </html>
もちろん、この例の場合では以下のURIがすべて有効であることが前提。(上記のHTMLファイルが「/test.html」であるとして)
- http://a.example.com/test.html でアクセスする場合
- http://a.example.com/hogehoge.js
- http://a.example.com/hogehoge.css
- http://a.example.com/hogehoge.png
- https://a.example.com/test.html でアクセスする場合
- https://a.example.com/hogehoge.js
- https://a.example.com/hogehoge.css
- https://a.example.com/hogehoge.png
どのブラウザでもちゃんと動作するのかについては検証していないが、とりあえず手元のFirefox 5.0では問題ないらしい。