SSLの設定を始めてやったのでメモしておきます。今回はSSLの証明書は独自で作成します。独自でもOKなのですね。
本来、セキュアなWebサーバを運用するためには、認証局から、署名付きの証明書を発行してもらう必要があります。認証局とは、CA(Certification Authority)とも呼び、証明書を発行する第三者機関のことです。認証局を利用しないで、独自でCAの証明書を発行し、認証することもできます。
サーバーはlighttpdです。以下の作業はrootユーザーで行います。
$ su
シードファイル作成
秘密鍵を作成する際に使う乱数情報ファイルを作成します。opensslのメッセージダイジェスト機能(md5)を使って作成。
$ openssl md5 * > rand.dat
- ここでエラーがでたら
以下のようなエラーがでる場合があります。
Read Error in apps
2539:error:0200B015:system library:fread:Is a directory:bss_file.c:167:
2539:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:168:
Read Error in lighttpd-1.4.11
2539:error:0200B015:system library:fread:Is a directory:bss_file.c:167:
2539:error:20082002:BIO routines:FILE_READ:system lib:bss_file.c:168:
....
カレントディレクトリにディレクトリが含まれているため、それらをファイルとして
読み込もうとした時に失敗したというエラーです。それ以外のファイルのハッシュは
出力されているようですので、問題ないでしょう。#ファイルのハッシュを乱数の種にするのは推奨できる方法ではないですよ。
#Linuxであれば/dev/randomも使えるのでそちらの方が安全かと。
ここにある通り、乱数ファイルを作成する際には、カレントディレクトリのファイルを使っています(*で指定してる)。それが起因するとのことです。エラーが発生してもファイルは生成されるのでおk。
また、ファイルのハッシュを乱数発生の種として使うは非推奨とのことですが、今回はこのやり方でやります。(調べても大抵この方法でやってました)
秘密鍵生成
秘密鍵のファイルはserver.pemとします。パスワードを聞かれるので、適当なものを入力。忘れないようにメモしておきます。
$ openssl genrsa -rand rand.dat -des3 1024 > server.pem
Generating RSA private key, 1024 bit long modulus
........++++++
..........................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
CSR生成 (今回は不要)
CSRとは、お客様が生成し、認証局に提出する署名リクエスト(Certificate Signing Request)です。
CSRとは、サーバー証明書を発行する際に必要とのこと。このファイルには、「SSL接続の際のURL(コモンネーム)」、「サイトを運営する組織の正式英語名称」等が含まれ、この情報を元に発行機関による審査が行われるようです。審査を通ると、発行機関がCSRに著名をし、正式な証明書として発行されます。
今回は独自で発行するのでこれは必要ないのですが、CSRの生成方法のみメモ。
$ openssl req -new -key server.pem -out csr.pem
コマンドを打つと、先ほど秘密鍵の時に入力したパスワードが求められ、続いて申請に必要な情報(コモンネームとか)が聞かれます。
証明書の生成
lighttpdを自動起動できるように、起動する際に証明書がパスフレーズを求めないように設定。「-nodes オプションで設定できます」。
CSRを生成すると共に、x509にもとづく署名機能を使って、独自で認証した認証書を作成します。
openssl req -new -x509 -keyout server.pem -out ca.pem -nodes
パスワード入力後、質問に答えます。メールアドレスまでは必須なので適当に回答。
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Tokyo
Organization Name (eg, company) [My Company Ltd]:comp
Organizational Unit Name (eg, section) :sect
Common Name (eg, your name or your server's hostname) :web
Email Address []:
これで発行完了です。
lighttpdの設定
- ファイルの設置
$ mkdir /etc/lighttpd/ssl/
$ mv server.pem /etc/lighttpd/ssl/
$ mv ca.pem /etc/lighttpd/ssl/
- アクセス制限をかけます
秘密鍵ファイルなどは厳重管理されるものなので600に設定して、他のユーザーから見えないようにします。
$ chmod 600 /etc/lighttpd/ssl/server.pem
$ chmod 600 /etc/lighttpd/ssl/ca.pem
- 乱数ファイルの削除
$ rm rand.dat
- lighttpd.confの設定
sslの設定関連のところをいじります。以下のように設定。
$SERVER["socket"] == "xxx.xxx.xxx.xxx:443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/server.pem"
ssl.ca-file = "/etc/lighttpd/ssl/ca.cer"
起動確認
lighttpdの起動を確認。
$ /etc/init.d/lighttpd start
- エラーが出た場合
こんなエラーがでました。
2642:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:632:Expecting: CERTIFICATE REQUEST
調べてみたら、秘密鍵に公開鍵の情報がなかったです。
公開鍵の情報を秘密鍵に書き込みます。
cat ca.pem >> server.pem
これで起動できました。