Apache + mod_ssl で使うSSL証明書の発行手順

CSR作成時にはSSLを使いたいドメインとそれを管理している組織の情報(名称、所在地)が必要なのであらかじめ用意しておくこと。具体的には

Country Name 国コード
日本ならJP。
State or Province Name
日本なら都道府県。Tokyoなど。
Locality Name
日本なら市区町村。Chiyoda-ku, Osaka cityなど。
Organization Name
会社名など。
Organizational Unit Name
部署名。空欄でかまわない。
Common Name
最重要項目!ドメインを指定する。最近はexample.comを申し込むとSubject Alternative Namesとしてwww.example.comでも有効なSSL証明書にしてくれることもある(逆もあり)。ワイルドカードSSLなら*.example.comとする。

これ以外の項目(メールアドレス、パスワードなど)は空でよい。Locality NameやOrganization Nameなどは認証局で削除したり上書きしたりすることもある。

秘密鍵CSRを同時に生成してしまう

以下のコマンドで一発で秘密鍵認証局SSL証明書発行業者)に渡すCSRを作ることができる。

$ openssl req -nodes -newkey rsa:2048 -sha256 -keyout mydomain.key -out mydomain.csr
req
CSR作成コマンド。詳しくはマニュアルを参照。
-nodes
秘密鍵を暗号化しない。暗号化するなら-des3などを指定する。暗号化した場合、Apacheの再起動など秘密鍵を読み込む際に常にパスワードが要求される。
-newkey rsa:2048
CSRで使う秘密鍵の作成を同時に行なう。暗号方式はRSA、鍵長は2048bitを指定。鍵長は4096bitだとより安全だが証明書の有効期間が数年程度なら2048bitで心配ないだろう。。鍵長1024bitだともはや認証局が受け付けてくれないはず。
-sha256
署名アルゴリズムにSHA-2を指定する*1SHA-1 (-sha1)とMD5 (-md5) も指定できるだろうがこれもおそらく認証局が受け付けないだろう。
-keyout mydomain.key
秘密鍵のファイル名を指定する。ここでは「mydomain.key」。
-out mydomain.csr
CSRのファイル名を指定する。ここでは「mydomain.csr」。

秘密鍵CSRの生成を別々に行なう場合

$ openssl genrsa -out mydomain.key 2048
$ openssl req -key mydomain.key -out mydomain.csr

2048bitのRSA秘密鍵をmydomain.keyとして保存し、次にその秘密鍵を指定してmydomain.csrというCSRファイルを作成している。
genrsaコマンドでは-desや-des3を指定しない限り秘密鍵そのものをパスワードで保護することはしない。乱数ファイルを指定したい場合は-randで指定する。

秘密鍵の暗号化解除

暗号化オプション付きで秘密鍵を生成した場合は次のコマンドで暗号化を解除できる

$ openssl rsa -in mydomain.key.org -out mydomain.key

パスワードを聞かれるので入力すればOK。
入力値は表示されず反応がないように見えるけど最後にEnterを押せばちゃんと処理されます。

各ファイルの内容を確認する

# CSR
$ openssl req -text -in ./mydomain.csr
# 公開鍵(証明書)
$ openssl x509 -text -in ./mydomain.pub

秘密鍵はコマンドをrsaにして同様に実行すれば見られますが、
見たところで意味のある情報は出てこないのでセキュリティの面から実行はしない方がいいと思います。

*1:2015年現在、SHA-1はすでに脆弱性が指摘され使用は推奨されておらず、SHA-2の使用が推奨されています。opensslの引数は -sha1 の代わりに -sha256 を指定します。