個人証明書を作ろう

〜S/MIMEでメールに電子署名と暗号化を、サーバーにはクライアント認証を〜

個人証明書を作成しましょう。

この個人証明書で電子メールの代表的な暗号化方式S/MIME(Secure MIME)を利用できるようになります。
PostfixのSSL化でもメールの暗号化は行われましたが、S/MIMEとは本質が違います。
メールサーバーのSSL化というのは、あくまでもメール経路の暗号化に過ぎません。
ですからユーザーからサーバー間は暗号化できますが、サーバーから相手サーバー、相手サーバーからメールの送信相手までの経路は暗号化されていなかったわけです。
これに対しS/MIMEの場合はメールそのものを添付ファイルまで含めて暗号化しますから、相手が復号するまでは完全に暗号化されています。
S/MIMEを利用できれば、メール本文に関してはPostfixのSSL化は必要ないと言えます。(でもSMTP-AUTHを暗号化するためにはSSL化は必要ですよ)
また暗号化だけでなく、メールに電子署名を付けることができるようになります。
これにより成りすましメールなどを撲滅できるわけです。

またこの個人証明書を利用して、サーバー側としてはクライアント認証が実装できるようになります。
クライアント認証とは、個人証明書を利用して認証を行うということです。
ユーザー認証ならばID&パスワードが漏れてしまえば誰でもアクセスできてしまいますし、IPアドレスやホスト名を利用したアクセス制限ではフレキシブルな認証はできません。
具体的には、Apacheなどで証明書を持たないユーザーにはアクセスできないプライベートディレクトリを作る、ProFTPdならば証明書を持たないユーザーからのアクセスは拒否する、のような使い方ですね。
出先から会社のプライベートエリアにノートパソコンでアクセスするビジネスマンなどを想定するのがいい例ではないでしょうか?

では、作成準備に取りかかりましょう。
まずはopenssl.cnfを編集します。
場所は/etc/pki/tls/openssl.cnfでしたね。

編集箇所は

[ usr_cert ]
# nsCertType = client, email

nsCertType = client, email

と変更し、変更したファイルをopenssl-smime.cnfと別名にして保存します。
保存ディレクトリは一緒で構わないので、/etc/pki/tls/openssl-smime.cnfとなりますね。

引き続き証明書作成ディレクトリを準備します。

# cd /var/ssl
# mkdir SMIME
# cd SMIME

では、いよいよ証明書の作成作業です。

# openssl req -new -keyout mns_key.pem -out mns_req.pem
Generating a 1024 bit RSA private key
......++++++
...........................++++++
writing new private key to 'mns_key.pem'
Enter PEM pass phrase:個人証明書を利用するユーザーの秘密鍵パスワード
Verifying - Enter PEM 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) [GB]:JP(日本)
State or Province Name (full name) [Berkshire]:Shizuoka(都道府県)
Locality Name (eg, city) [Newbury]:Iwata(市町村)
Organization Name (eg, company) [My Company Ltd]:Mizushima Network Service(組織名)
Organizational Unit Name (eg, section) []:koko(所属)
Common Name (eg, your name or your server's hostname) []:mizushima.ne.jp(クライアント認証を行うサーバーのドメイン)
Email Address []:mns@mizushima.ne.jp(S/MIME暗号化で使用するメールアドレス)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:そのままEnter
An optional company name []:そのままEnter

ここまでで個人証明書を利用するユーザーの秘密鍵と署名要求書(CSR)が作成されました。
秘密鍵 /var/ssl/SMIME/mns_key.pem
署名要求書 /var/ssl/SMIME/mns_req.pem

引き続きCAに署名してもらい、証明書を作成します。

# openssl ca -config /etc/pki/tls/openssl-smime.cnf -in mns_req.pem -out mns_cert.pem
Using configuration from /usr/share/ssl/openssl-smime.cnf
Enter pass phrase for /var/ssl/CA/private/cakey.pem:CA秘密鍵パスワード
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 5 (0x5)
Validity
Not Before: Jul 31 14:32:27 2007 GMT
Not After : Jul 28 14:32:27 2017 GMT
Subject:
countryName = JP(証明書の内容が正しいか確認してください)
stateOrProvinceName = Shizuoka
organizationName = Mizushima Network Service
organizationalUnitName = koko
commonName = mizushima.ne.jp
emailAddress = mns@mizushima.ne.jp
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
AC:90:9B:F9:A8:8F:DA:1E:31:A2:44:1F:A5:7B:AC:62:CC:31:94:17
X509v3 Authority Key Identifier:
keyid:85:F0:5A:12:CA:39:78:DF:DD:EB:E4:59:C2:EB:CF:0C:CF:C5:90:87
DirName:/C=JP/ST=Shizuoka/L=Iwata/O=Mizushima Network Service/OU=koko/CN=mizushima.ne.jp/emailAddress=mns@mizushima.ne.jp
serial:00

Certificate is to be certified until Jul 28 14:32:27 2017 GMT (3650 days)
Sign the certificate? [y/n]:y (証明書の内容が上記で間違いなければy)

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

これで個人証明書の作成は完了です。
個人証明書 /var/ssl/SMIME/mns_cert.pem
作成は完了なのですが・・・実はこのままではクライアント側にインストールすることができません。
証明書と秘密鍵を1つにまとめてp12という形に変換してやる必要があります。

# openssl pkcs12 -export -in mns_cert.pem -inkey mns_key.pem -certfile ../CA/cacert.pem -name mizushima.ne.jp -caname mizushima.ne.jp -out mns_cert.p12
Enter pass phrase for mns_key.pem:個人証明書を利用するユーザーの秘密鍵パスワード
Enter Export Password:個人証明書インストール時のパスワード
Verifying - Enter Export Password:個人証明書インストール時のパスワード

これでやっとユーザーがインストールできる形になりました。
秘密鍵入り個人証明書 /var/ssl/SMIME/mns_cert.p12
あとはこれをなんらかの形でユーザーに渡して、インストール時のパスワードとともにインストールしてもらうだけです。
またクライアント認証を行うには各サーバー毎にまた設定していく必要があります。

お疲れ様でした。