個人証明書を作ろう

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

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

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

またこの個人証明書を利用して、サーバー側としてはクライアント認証が実装できるようになります。
クライアント認証とは、個人証明書を利用して認証を行うということです。
ユーザー認証ならばID&パスワードが漏れてしまえば誰でもアクセスできてしまいますし、IPアドレスやホスト名を利用したアクセス制限ではフレキシブルな認証はできません。
これに対しクライアント認証とは、個人証明書を持つ者のみアクセスできるようにする、という認証です。

では、作成準備に取りかかりましょう。
個人証明書を作ろう 〜S/MIMEでメールに電子署名と暗号化を、サーバーにはクライアント認証を〜
まずはopensslを編集します。
場所はC:\usr\ssl\binでしたね。

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

編集箇所は

[ usr_cert ]
# nsCertType = client, email

nsCertType = client, email

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

では、いよいよ証明書の作成作業です。
証明書を保存するディレクトリ、C:\usr\ssl\bin\smimeを作成しておいてください。

OpenSSL> req -new -keyout smime/mns_key.pem -out smime/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)が作成されました。
秘密鍵 C:\usr\ssl\bin\smimel\mns_key.pem
署名要求書 C:\usr\ssl\bin\smime\mns_req.pem

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

OpenSSL> ca -config openssl-smime.cnf -in smime/mns_req.pem -out smime/mns_cert.pem
Using configuration from C:/usr/ssl/bin/openssl-smime.cnf
Enter pass phrase for C:/usr/ssl/bin/private/cakey.pem:CA秘密鍵パスワード
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 5 (0x5)
Validity
Not Before: May 17 14:32:27 2006 GMT
Not After : May 17 14:32:27 2007 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 May 17 14:32:27 2007 GMT (365 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

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

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

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

お疲れ様でした。

stoneでクライアント認証をしよう