2008年7月23日水曜日

OpenSSLでお手軽に自己証明書(2)_opensslコマンド

前回の記事の中で少しだけ言及した、opensslコマンドで自己証明書のキーペアを作成する方法。
ちなみにSSLv3/TLS対応で、IISで使える形式も作れます。
 
事前にキーペアを作成する手順を簡単にまとめておきます、結構この流れは社内でも新人さんとかよく迷うので。
そう複雑ではないのですけどね。

  1. サーバの秘密鍵を作成する

  2. 秘密鍵を基にして証明書要求(CSR)を発行する

  3. CSRにサーバ秘密鍵を使いまわして署名、証明書作成

  4. サーバ秘密鍵+証明書でキーペア完成、CSRはもういらない

要は同じ公開鍵が作れる秘密鍵と証明書の2つがあればSSL通信を設定することができる、というわけですね。
有料の証明書サービスを使う場合は、手順2で作ったCSRを業者さんに渡して、証明書を作ってもらえばOK。

では手順のほうへ。
 

サーバの秘密鍵を作成する


トリプルDESで秘密鍵を作成します、これより弱い方式ではSSLv3になりません。
この方式で作成するときには秘密鍵を読み込むためのパスワード(パスフレーズ)を設定しなければなりません、適当なものを入力します。
※host.domain.keyはただのファイル名なので何でもよいです。
# openssl genrsa -des3 -out host.domain.key 1024

これで一応秘密鍵は完成ですが、パスフレーズが有効なままではなにかと不便です。
例えばhttpdを起動する際に毎回パスフレーズの入力を求められるなど、運用上で致命的な問題が。
よってパスフレーズを無効にします、一度パスフレーズの入力が必要です。
# openssl rsa -in host.domain.key -out host.domain.key
秘密鍵は一応大事なので、パーミッションを400にするなど少し漏洩には気をつけます。
memo:
以降の作業でWindows版の場合は、「OPENSSL_CONF」環境変数が設定されていないとエラーになるケースがある、
デフォルトでよいので設定しておく。
/// コンフィグファイルを環境変数に設定
> set OPENSSL_CONF={opensslのインストールパス}openssl.cnf

 

証明書要求(CSR)を作成する


ここでの入力内容は前回の記事と一緒です。
※host.domain.csrはただのファイル名なので何でもよいです。
# openssl req -new -key host.domain.key -out host.domain.csr


斜体はサーバからの問い合わせ、太字が入力例なのでコモンネームに気をつけて各自適当に。
実際はもう少し続きますが、これ以降は全部空白でエンター押してかまいません。
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Hyogo
Locality Name (eg, city) [Newbury]:Kobe-shi
Organization Name (eg, company) [My Company Ltd]:iCRAFT Ltd.
Organizational Unit Name (eg, section) []: (部署名、無記入でもOK)
Common Name (eg, your name or your server's hostname) []:hogehoge.example.com
(コモンネーム、SSL証明書を適用するサーバのFQDNを書きましょう)
Email Address []:(省略可)
 
CSRができました、一応下記のコマンドで内容を確認してみてください。
# openssl req -text -in host.domain.csr
# openssl req -subject -in host.domain.csr

 

要求に署名する


仕上げは自己署名です、-daysオプションは有効期限を今日から数えて何日にするか指定します。
サンプルでは3650日間、10年間有効ですね。
※host.domain.crtはただのファイル名なので何でもよいです。
# openssl x509 -req -days 3650 -sha1 -in host.domain.csr -signkey host.domain.key -out host.domain.crt

2009/01/06 チョイ修正:デフォルトのmd5は脆弱だということでsha1を使うように変更、いわゆるsha2は使えないのかな?

有効期限の上限ですが、西暦1万年を超えなければ大丈夫だった気がします。
 
 

これでキーペア完成、慣れたらopensslコマンドで色々遊んでみましょう、
基本は「入力フォーマットと読むファイル」、「出力フォーマットと出力先」を指定するだけのコマンドですが、
色々と面白い出力が得られます。
 
 

おまけ:IISにインポートできる形式(pk12)にする


apacheなら上記のセットがあればSSLもOKなのですが、
Windowsでは秘密鍵ごと格納する、「証明書ストア」と呼ばれるPKIの管理機能を持っています。
IISでのSSLに、上記の証明書を使い対場合は、使える方式に変換してあげる必要があります。
 
この方式ではエクスポートの際にパスワードを設定し、インポートする際はパスワード照合を行います、
パスワードの入力を促されるので、忘れないようして設定します。
※host.domain.p12はただのファイル名なので何でもよいです。
# openssl pkcs12 -export -in host.domain.crt -inkey host.domain.key -out host.domain.p12

完成したファイルはIISで直接インポート可能です。