[ホーム] -> [Aache + PHP + PostgreSQL 実験室] |
SSL を使う場合、ほとんどのケースでサーバに「サーバ証明書」というのが必要になります。これは、「あなたがアクセスしたサーバは本物ですよ」というのを証明するためファイルです。もしこれがないと、何かでサーバがダウンしているときに、誰かが同じ IP アドレスでネットワークに接続し、正しいサーバを偽るかもしれません。
ちなみに、サーバが使う証明書なので、サーバ証明書と言っているだけで、実際は、クライアントでも使う証明書と同じものです。メールの署名などで使う証明書も、同じ方法で作れます。
OpenSSL の場合、openssl
コマンドを使って作業します。証明書を作成するには(正確には証明書署名要求)、openssl req -new -keyout 秘密鍵ファイル.pem -text -out 証明書署名要求.req
というコマンドを使います。-keyout 秘密鍵ファイル.pem
は省略可能ですが、省略すると、privkey.pem
という秘密鍵ファイルが出来ます。
このコマンドを入力すると、次のログのようなメッセージが流れ、いろいろ聞かれます。Enter PEM pass phrase: ですが、ここに秘密鍵ファイル用のパスワードを入力します。何でも構わないですが、4文字以上ないと受け付けてくれません。残りの項目は適当に埋めて構いません。ですが、公開する場合は、あまり変な値を入れると笑われてしまいますよ。
> openssl req -new -keyout certkey.pem -text -out cert.req Using configuration from /usr/share/ssl/openssl.cnf Generating a 1024 bit RSA private key ................++++++ .++++++ writing new private key to 'certkey.pem' Enter PEM pass phrase:pass phrase Verifying password - Enter PEM pass phrase:pass phrase ----- 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]:Tokyo Locality Name (eg, city) []:. Organization Name (eg, company) [Internet Widgits Pty Ltd]:HizLab Organizational Unit Name (eg, section) []:. Common Name (eg, your name or your server's hostname) []:www.hizlab.net Email Address []:hizuya@hizlab.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
最後の A challenge password []: と An optional company name []: ですが、気にせず何も入力しなくて大丈夫です。
次に、この証明書に自己署名をします。これにもやはり openssl
コマンドを使います。実際は、openssl req -x509 -in 証明書署名要求.req -text -key 秘密鍵ファイル.pem -out 署名済み証明書.crt
という感じになります。パスワードを聞かれるので、先ほどの秘密鍵ファイルのパスワードを入力してください。
> openssl req -x509 -in cert.req -text -key certkey.pem -out cert.crt Using configuration from /usr/share/ssl/openssl.cnf Enter PEM pass phrase:pass phrase
これで自己署名のされたサーバ証明書ができあがりました。PostgreSQL や Apache で SSL を使うには、この署名済みのサーバ証明書と、先ほどの秘密鍵ファイルの二つのファイルが必要です。しかしこのままだと、PostgreSQL/Apache の起動時に、秘密鍵ファイルのパスワードを聞いてきてしまい、自動で起動しなくなってしまいます。これを避けるために、秘密鍵ファイルからパスワードを削除してしまいます(もちろん、毎回入力するつもりの人は、削除しなくてもいいです)。
削除するには、openssl rsa -in 秘密鍵ファイル.pem -out パスワード無し秘密鍵ファイル.pem
とします。このときにもやはり、秘密鍵ファイルのパスワードを聞いてきます。
> openssl rsa -in certkey.pem -out certnokey.pem read RSA key Enter PEM pass phrase:pass phrase writing RSA key
ちなみに、パスワード無し秘密鍵ファイルにパスワードを付けるには、openssl rsa -des3 -in パスワード無し秘密鍵ファイル.pem -out パスワード付き秘密鍵ファイル.pem
と実行すると、新たに付けるパスワードを聞いてきます。
とにかくこれで、パスワード無し秘密鍵ファイル(certnokey.pem
)とサーバ証明書(cert.crt
)が作成されました