読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

自己署名証明書でテスト環境構築その他諸々(何)

Apache httpd SSL PHP メモ

構築する、放置する、分からなくなる、構築する、放置する、分からなくなる(以下略)を繰り返していた(謎)ので、今度こそメモに残すらしい。

自己署名証明書の作成

これは単にコマンドを叩くだけ。

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'
        • -
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank.
        • -
Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Hokkaido Locality Name (eg, city) :Sapporo Organization Name (eg, company) [Internet Widgits Pty Ltd]:HHeLiBeX Organizational Unit Name (eg, section) : Common Name (eg, YOUR name) :a.example.com Email Address :admin@example.com

本当はちゃんとした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では問題ないらしい。