OXY NOTES

OpenSSLとプライベートCAでメールサーバ用の秘密鍵と公開鍵証明書を作成

これで暗号化通信に必要なファイルが揃います

前回の投稿で「OpenSSL」を利用して「プライベートCA」を構築しました。

続いて「メールサーバ用の秘密鍵と公開鍵署名要求」を作成。作成した「公開鍵署名要求」をプライベートCA電子署名して、「公開鍵証明書」を作成します。


メールサーバ用の秘密鍵を作成

1.まずpostfix用の鍵を保存するディレクトリを作成して、作成したディレクトリに移動

# mkdir /etc/pki/postfix
# cd /etc/pki/postfix

2.鍵長2048bit、des3暗号化アルゴリズムのRSA秘密鍵の作成

以下のようにコマンドを打ちます。

# openssl genrsa -des3 -out (秘密鍵ファイル名).key 2048

それぞれ解説すると
genrsa」が秘密鍵作成
-des3」が暗号化アルゴリズム
-out」が書き出されるファイル
2048」が暗号の鍵長2048bit。何も指定しないと1024bitの鍵長になります。2012年現在は2048bit以上が安全とされています。しかし古い携帯とのやり取りで不具合の可能性があるため、そのような環境で運用する場合は1024bitを指定します。
(Linuxにおいて拡張子に決まりはありませんが、秘密鍵の拡張子はkeyやpemとすることが多い。)

今回は秘密鍵ファイル名は「postfix.key」にしました。

# openssl genrsa -des3 -out postfix.key 2048

すると以下のように応答があるのでpostfix用のパスワードを入力します。

Generating RSA private key, 2048 bit long modulus
.....+++
....................................+++
e is 65537 (0x10001)
Enter pass phrase for postfix.key: ←パスワードの入力
Verifying - Enter pass phrase for postfix.key: ←再度同じパスワードの入力

これでメールサーバ用の秘密鍵が作成されました。「/etc/pki/postfix」ディレクトリに「postfix.key」が作成されていることを確認してください。

秘密鍵は他のユーザーから読めないようにパーミッションを変更します。

# chmod 600 postfix.key

メールサーバ用の秘密鍵を元に、証明書署名要求(CSR)を作成

同じように以下のコマンドを打ちます。(秘密鍵ファイル名)は上で作ったファイル名を入力してください。

# openssl req -new -key (秘密鍵ファイル名).key -out  (CSRファイル名).csr

それぞれ解説すると
req」が証明書要求
-new」で新しい証明書要求を生成します
-key filename」で読み込む秘密鍵を指定
-out filename」で作成される証明書のファイル名を指定

今回は証明書署名要求(CSR)ファイル名は「postfix.csr」にしました。

# openssl req -new -key postfix.key -out postfix.csr
Enter pass phrase for postfix.key: ←先ほど作成したメールサーバ用秘密鍵のパスワードを入力
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) [GB]:JP ←国コードを入力
State or Province Name (full name) [Berkshire]:Tokyo ←都市を入力
Locality Name (eg, city) [Newbury]:Shinagawa ←市区町村を入力
Organization Name (eg, company) [My Company Ltd]:hoge ←組織名を入力
Organizational Unit Name (eg, section) []: ←部署名を入力(空欄でもよい)
Common Name (eg, your name or your server's hostname) []:example.com ←postfixで設定したホスト名の入力。重要なので間違えないように
Email Address []: ←メールアドレスを入力(空欄でよい)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←証明書破棄時のパスワードを入力(空欄でよい)
An optional company name []: ←別の組織名を入力(空欄でよい)

これで「証明書署名要求(CSR)」が作成されました。「/etc/pki/postfix」ディレクトリに「postfix.csr」が作成されていることを確認してください。


証明書署名要求(CSR)をプライベートCAで署名して、公開鍵証明書(公開鍵)の作成

公開鍵証明書」を作成するコマンドを打ちます。上で作った「証明書署名要求」と、「プライベートCAの公開鍵、秘密鍵」を利用して署名します。

# openssl x509 -CA (CA公開鍵).pem -CAkey (CA秘密鍵).pem -req -in (CSRファイル名).csr -out (公開鍵証明書ファイル名).pem -days 3650 -CAcreateserial 

それぞれ解説すると
x509」が証明書の表示と署名ユーティリティ
-CA filename」が署名に利用する公開鍵証明書の指定
-CAkey filename」がCA秘密鍵を指定
-req」で証明書要求
-in filename」でCSR(証明書署名要求)ファイルを指定
-out filename」で作成される公開鍵証明書ファイル名を指定
-days arg」で証明書の有効期限を指定
-CAcreateserial」が鍵のシリアルナンバーを割り振ります。index.txtというファイルに書きだされます。

今回は公開鍵証明書ファイル名は「postfix.pem」にしました。プライベートCAの公開鍵、秘密鍵はディレクトリが違うので、フルパスで指定してください。

# openssl x509 -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -req -in postfix.csr -out postfix.pem -days 3650 -CAcreateserial

すると再び秘密鍵のパスワードを求められるので入力します。

Signature ok
subject=/C=JP/ST=Tokyo/L=Shinagawa/O=Oxy/CN=mail.example.com
Getting CA Private Key
Enter pass phrase for /etc/pki/CA/private/cakey.pem: ←プライベートCAの秘密鍵に指定したパスワードを入力

これで「公開鍵証明書(CSR)」が作成されました。「/etc/pki/postfix」ディレクトリに「postfix.pem」が作成されていることを確認してください。


パスフレーズで暗号化された秘密鍵を復号化

上記の方法で秘密鍵を作成すると、パスフレーズで暗号化された状態で作成されます。暗号化されたほうが安全性は高まりますが、ソフトによって扱いが変わります。
Apacheのように起動の時にパスフレーズを求めるもの、Dovecotのように設定ファイルでパスフレーズを入力するもの、Postfixのように暗号化された秘密鍵をサポートしていないソフトもあります。

例えば「Postfix」で暗号化された秘密鍵を使うと「maillog」に以下のようなエラーログが出ます。

warning: cannot get private key from file /etc/pki/postfix/postfix.key
または
cannot load RSA certificate and key data

安全な場所で所有権がしっかりと設定されていることを前提として、秘密鍵を復号します。(一般にパスフレーズの削除といわれる作業です)

秘密鍵のディレクトリに移動して、以下のコマンドで作成します。

# openssl rsa -in (パス有りファイル) -out (パスなしファイル)

それぞれ解説すると
rsa」がRSAの変換要求
-in filename」が変換前のファイル選択
-key filename」が変換後のファイル名を指定

今回は新しく作られるパスワードなしの秘密鍵ファイル名は「postfix_noenc.key」にしました。

# openssl rsa -in postfix.key -out postfix_noenc.key
Enter pass phrase for postfix.key: ←パスワードの入力
writing RSA key

続けてパスフレーズを削除した秘密鍵のパーミッションを変更します。

# chmod 600 postfix_noenc.key

変換前と後のファイルを見るとファイルの先頭部分が変わっているのが分かります。

postfix.key(変換前)

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED

postfix_noenc.key(変換後)

-----BEGIN RSA PRIVATE KEY-----

以降、Linux内部のローカルな環境で秘密鍵を指定する場合は「postfix_noenc.key」を指定してください。


各種作成したファイルの確認方法

今回作成したファイルは暗号化されているため、そのままでは内容を把握することができません。そのため、秘密鍵や証明書署名要求の内容を確認したい場合は、以下のコマンドで確認してください。

秘密鍵の確認

# openssl rsa -noout -text -in (秘密鍵ファイル名).key

csrの確認

# openssl req -noout -text -in (CSRファイル名).csr

証明書の確認

# openssl x509 -noout -text -in (証明書ファイル名).pem

以上で「OpenSSL」を利用して「プライベートCAを構築」し、「メール用の秘密鍵と公開鍵証明書(公開鍵)の作成」まで終了しました。

メールのセキュリティについて長々と続けてきましたが、これで下準備は完了です。
次は「Postfixによる、セキュリティに配慮したメールサーバの構築方法」です。今まで設定した「ユーザー認証」や、「公開鍵証明書」などを利用してメールサーバを設定します。