作成開始 : 平成19年(2007)03月16日(金)  最終更新日 : 平成23年(2011)01月07日(金)

S/MIME(Secure MIME)で電子メールを交換する個人証明書作成を試す


NTT Docomo「e ビリング」からの料金お知らせメールがセキュアなもので届きます。これを試してみたくなりました。
サーバーのSSL化と違いメールそのものを添付ファイルまで含めて暗号化します。ですので、受信者が復号行為をするまでは完全に暗号化されます。
S/MIME(Secure MIME)は電子メールの代表的な暗号化方式です。

S/MIMEの詳細については、日本ベリサインをご覧ください。

参考にしたサイト -> Mizushima Network Service (ありがとうございました ( ´ー`) )

先にインストール済みのOpenSSLを使ってみます。ステップは次のとおりです。


1.認証局(CA)の開局 -> CA

ユーザーから送られてきた署名要求書に署名・認証し証明書を発行する機関です。
証明書を使用するサーバーが本物であることをCAが保証します。(普通はベリサインとかの信頼できる機関が行います・・・有料で!)

ここでは、CAの証明書CAの秘密鍵を作り開局します。

2.サーバーの秘密鍵と署名要求書(CSR)の作成 -> ユーザ

サーバーの秘密鍵およびCAに送付する署名要求書(CSR)を作成します。

3.証明書の発行 -> CA

ユーザーから送付された署名要求書(CSR)に署名・認証してユーザーに返送するサーバー証明書を作成します。

4.サーバーへの設定 -> ユーザー

サーバーの秘密鍵とCAから返送されたサーバー証明書をサーバーに設定します。
実際はこんな流れですね。

・・・・・と上記はサーバーのSSL化の流れですが、個人証明書なので次のステップで作成してみます。

@認証局(CA)の開局 -> CA    ・・・・・・CA開局してないためです。開局してればここは不要です。

ユーザーから送られてきた署名要求書に署名・認証し証明書を発行する機関です。
証明書を使用するサーバーが本物であることをCAが保証します。(普通はベリサインとかの信頼できる機関が行います・・・有料で!)

ここでは、CAの証明書CAの秘密鍵を作り開局します。

A個人証明書を利用するユーザーの秘密鍵署名要求書(CSR)の作成。 -> ユーザ

個人証明書を利用するユーザーの秘密鍵およびCAに送付する署名要求書(CSR)を作成します。

B証明書の発行 -> CA

ユーザーから送付された署名要求書(CSR)に署名・認証してユーザーに返送する個人証明書を作成します。

C秘密鍵入り個人証明書の作成 -> ユーザー

クライアント・インストール用にユーザーの秘密鍵とCAから返送された個人証明書を1つにまとめ拡張子p12のファイルを作成します。
秘密鍵入り個人証明書です。これが実際に使われるものです。何らかの方法でユーザに配布しインストールしてもらいます。

それでは、実際にやってみましょう。


@認証局(CA)の開局 -> CA

まずはCAを置くディレクトリを作成します。(お決まりなので間違えないように)外部にさらしていないところならどこでもいいでしょう。
・・・ということで、/var に作ってみます。スーパー・ユーザで作業します。
XC13# cd /var
XC13# mkdir ssl
XC13# cd ssl
XC13# mkdir CA
XC13# cd CA
XC13# mkdir certs crl newcerts private
XC13# echo "01" > serial
XC13# touch index.txt
作成したディレクトリにあわせて openssl.cnf を編集します。このサーバーでは /etc/ssl/openssl.cnf です。
編集箇所は次です。
[ CA_default ]

dir = ./demoCA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir/newcerts # default place for new certs.


上記の dir = ./demoCA を dir = /var/ssl/CA にします。
そして、CAを作成します。(黄文字は入力です。カッコ内は解説なので入力してはいけません)
xc13# openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -days 3650
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
.......++++++
....++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
(CAのパスワード)
Verifying password - Enter PEM pass phrase:
(CAのパスワードの確認入力)
-----
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) [AU]:
JP (日本)
State or Province Name (full name) [Some-State]:
Miyagi (都道府県)
Locality Name (eg, city) []:
Sendai (市区町村)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Takaq Home Server (組織名)
Organizational Unit Name (eg, section) []:
se (所属名)
Common Name (eg, YOUR name) []:
takaq1.plala.jp (ドメイン名)
Email Address []:
master@takaq1.plala.jp (管理者のメールアドレス)
xc13#
どれどれ、できたか確認・・・・!
xc13# pwd
/var/ssl/CA
xc13# ll
total 7
-rw-r--r-- 1 root wheel 1334 3/17 16:00 cacert.pem → CA証明書
drwxr-xr-x 2 root wheel 512 3/17 15:39 certs
drwxr-xr-x 2 root wheel 512 3/17 15:39 crl
-rw-r--r-- 1 root wheel 0 3/17 15:40 index.txt
drwxr-xr-x 2 root wheel 512 3/17 15:39 newcerts
drwxr-xr-x 2 root wheel 512 3/17 15:57 private
-rw-r--r-- 1 root wheel 3 3/17 15:39 serial
xc13# ll private
total 1
-rw-r--r-- 1 root wheel 963 3/17 16:00 cakey.pem → CA秘密鍵
xc13#
これでCA局の作成終了です。

A個人証明書を利用するユーザーの秘密鍵署名要求書(CSR)の作成。 -> ユーザ

まずは証明書を置くディレクトリを作成します。スーパー・ユーザで作業します。
XC13# cd /var/ssl
XC13# mkdir SMIME
XC13# cd SMIME
openssl.cnf を openssl-smime.cnf ( cp /etc/ssl/openssl.cnf /etc/ssl/openssl-smime.cnf )としてコピーし openssl-smime.cnf を編集します。
編集箇所は次です。
[ usr_cert ]

# These extensions are added when 'ca' signs a request.

# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

basicConstraints=CA:FALSE

# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.

# This is OK for an SSL server.
# nsCertType = server

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email
  ・
  ・
  ・
上記の# nsCertType = client, email のリマーク( # ) を外して有効にします。
そして、証明書を作成します。(黄文字は入力です。カッコ内は解説なので入力してはいけません)
xc13# openssl req -new -keyout takaq_key.pem -out takaq_req.pem
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...........++++++
..............++++++
writing new private key to 'takaq_key.pem'
Enter PEM pass phrase:
(個人証明書を利用するユーザーの秘密鍵パスワード)
Verifying password - 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) [AU]:
JP (日本)
State or Province Name (full name) [Some-State]:
Miyagi (都道府県)
Locality Name (eg, city) []:
Sendai (市区町村)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Takaq Home Server (組織名)
Organizational Unit Name (eg, section) []:
se (所属名)
Common Name (eg, YOUR name) []:
takaq1.plala.jp (クライアント認証を行うサーバーのドメイン)
Email Address []:
takaq@takaq1.plala.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)
xc13#
どれどれ、できたか確認・・・・!
xc13# pwd
/var/ssl/SMIME
xc13# ll
total 2
-rw-r--r-- 1 root wheel 963 3/17 16:43 takaq_key.pem → ユーザーの秘密鍵
-rw-r--r-- 1 root wheel 716 3/17 16:43 takaq_req.pem
→ 署名要求書(CSR)
xc13#
おぉーできてる。次はCAに署名してもらって証明書の作成です。

B証明書の発行 -> CA

次のようにして作成します。(黄文字は入力です。カッコ内は解説なので入力してはいけません)
xc13# openssl ca -config /etc/ssl/openssl-smime.cnf -in takaq_req.pem -out takaq_cert.pem
Using configuration from /etc/ssl/openssl-smime.cnf
Enter PEM pass phrase: 
(CAの秘密鍵パスワード)
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:
'JP' (以下の内容が正しいか確認します)
stateOrProvinceName :PRINTABLE:
'Miyagi'
localityName :PRINTABLE:
'Sendai'
organizationName :PRINTABLE:
'Takaq Home Server'
organizationalUnitName:PRINTABLE:
'se'
commonName :PRINTABLE:
'takaq1.plala.jp'
emailAddress :IA5STRING:
'takaq@takaq1.plala.jp'
Certificate is to be certified until Mar 16 08:01:50 2008 GMT (365 days)
Sign the certificate? [y/n]:
y (確認OKなら y)


1 out of 1 certificate requests certified, commit? [y/n]
y (作ってよければ y)
Write out database with 1 new entries
Data Base Updated
xc13#
どれどれ、できたか確認・・・・!
xc13# pwd
/var/ssl/SMIME
xc13# ll
total 6
-rw-r--r-- 1 root wheel 3781 3/17 17:02 takaq_cert.pem → 個人証明書
-rw-r--r-- 1 root wheel 963 3/17 16:43 takaq_key.pem
-rw-r--r-- 1 root wheel 716 3/17 16:43 takaq_req.pem
xc13#
うん、できてる。

C秘密鍵入り個人証明書の作成 -> ユーザー

クライアント・インストール用にユーザーの秘密鍵とCAから返送された個人証明書を1つにまとめ拡張子p12のファイルを作成します。
秘密鍵入り個人証明書です。これが実際に使われるものです。何らかの方法でユーザに配布しインストールしてもらいます。
xc13# openssl pkcs12 -export -in takaq_cert.pem -inkey takaq_key.pem -certfile ../CA/cacert.pem -name takaq1.plala.jp -caname takaq1.plala.jp -out takaq_cert.p12
Enter PEM pass phrase: (個人証明書を利用するユーザーの秘密鍵パスワード)
Enter Export Password:
(個人証明書インストール時のパスワード)
Verifying password - Enter Export Password:
(個人証明書インストール時のパスワード確認入力)
xc13#
どれどれ、できたか確認・・・・!
xc13# pwd
/var/ssl/SMIME
xc13# ll
total 10
-rw-r--r-- 1 root wheel 3140 3/17 17:21 takaq_cert.p12 → これですね。
-rw-r--r-- 1 root wheel 3781 3/17 17:02 takaq_cert.pem
-rw-r--r-- 1 root wheel 963 3/17 16:43 takaq_key.pem
-rw-r--r-- 1 root wheel 716 3/17 16:43 takaq_req.pem
xc13#
できています。次は実際にメーラーに設定してやってみます。(この証明書を用いたクライアント認証については後で勉強してみます)
S/MIMEを用いた電子メールの設定方法は こちら をクリックしてね。
S/MIMEを用いた電子メールの交換方法は こちら をクリックしてね。

●平成20年03月20日(木) 追記・・・・・・・本当は別の正しいやり方があると思う。

ほぼ1年前に作った個人証明書が有効期限切れとなったので、新しく作りなおそうと思った。
A個人証明書を利用するユーザーの秘密鍵署名要求書(CSR)の作成。

openssl req -new -keyout takaq_key.pem -out takaq_req.pem ---------------> 正常に終わった。
B証明書の発行

openssl ca -config /etc/ssl/openssl-smime.cnf -in takaq_req.pem -out takaq_cert.pem ----> エラー出てNGだった。

「それは既にあるよ!」みたいなエラーで 0バイトの takaq_cert.pem が出来ていた。
そこで、ちょっと /var/ssl/CA をのぞいてみた。

そしたら・・・・・・何個かファイルあったけど、クライアントの証明関係は次でないかと思った。
index.txt -> 下のような内容のファイルだった。(一つ前のファイルが index.txt.old であった)
V 090320073323Z 01 unknown /C=JP/ST=Miyagi/O=Takaq Home Server/OU=se/CN=takaq1.plala.jp/Email=takaq@takaq1.plala.jp
V 090320073455Z 02 unknown /C=JP/ST=Miyagi/O=Takaq Home Server/OU=se/CN=takaq1.plala.jp/Email=chieko1@takaq1.plala.jp
V 090320073528Z 03 unknown /C=JP/ST=Miyagi/O=Takaq Home Server/OU=se/CN=takaq1.plala.jp/Email=takaq123@takaq1.plala.jp
newcerts(ディレクトリ) -> 下のようなファイルがあった。
-rw-r--r-- 1 root wheel 3781 3/17 2007 01.pem
-rw-r--r-- 1 root wheel 3783 3/17 2007 02.pem
-rw-r--r-- 1 root wheel 3811 3/25 2007 03.pem

例えば、01.pem の内容は次のようであった。

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=JP, ST=Miyagi, L=Sendai, O=Takaq Home Server, OU=se, CN=takaq1
.plala.jp/Email=master@takaq1.plala.jp
Validity
Not Before: Mar 17 07:33:23 2007 GMT
Not After : Mar 17 07:33:23 2008 GMT
Subject: C=JP, ST=Miyagi, O=Takaq Home Server, OU=se, CN=takaq1.plala.jp
/Email=takaq@takaq1.plala.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:d2:a8:90:8f:a4:5f:35:94:d0:76:4e:16:d4:a1:
1d:a0:3f:66:54:9a:6d:a5:a0:e2:5c:4a:f7:91:a4:
b2:e4:5a:3f:bd:5b:c9:99:9e:36:84:97:1d:50:8a:
bb:c6:88:59:c7:33:4a:1d:d9:b4:df:39:d2:e7:69:
88:fd:03:5f:0d:e6:14:7e:07:5e:99:67:d1:6d:98:
b8:91:09:13:04:0f:59:87:30:d1:22:7c:0e:43:98:
8f:89:d2:73:e3:0c:80:88:0d:0f:7b:0b:89:82:81:
e8:a0:bc:e9:b8:51:b0:d1:5b:32:5f:2b:19:cb:bc:
b4:40:a0:86:f3:72:b2:8f:8f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
AE:B7:9E:12:E6:23:88:6D:5F:E5:20:AC:10:2C:34:56:89:86:BE:67
X509v3 Authority Key Identifier:
keyid:3E:91:65:F6:AF:68:89:15:B0:B5:28:FB:B2:23:D0:22:E2:40:5C:D
4
DirName:/C=JP/ST=Miyagi/L=Sendai/O=Takaq Home Server/OU=se/CN=ta
kaq1.plala.jp/Email=master@takaq1.plala.jp
serial:00

Signature Algorithm: md5WithRSAEncryption
1e:cc:1b:fa:11:67:93:91:09:ee:bb:d5:e9:ef:4a:58:49:dd:
87:7b:23:99:4b:38:35:d4:02:0e:da:3b:66:3d:e2:23:f9:2b:
0d:4b:9a:78:83:5f:60:69:db:ba:ed:bb:be:dc:df:96:98:48:
29:fe:d4:a0:1e:97:c7:3e:e7:08:6a:88:4d:46:3c:5a:21:30:
12:4b:a7:05:87:19:6c:6e:05:d5:31:06:b3:f0:2c:95:4e:79:
d2:83:5f:8f:21:f2:cf:69:3d:d2:59:cc:dd:0a:84:ee:0f:54:
8b:a7:6e:38:e2:20:86:6c:1a:a2:84:3c:c7:51:59:fe:6c:f4:
9d:f7
-----BEGIN CERTIFICATE-----
MIID2DCCA0GgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBnDELMAkGA1UEBhMCSlAx
DzANBgNVBAgTBk1peWFnaTEPMA0GA1UEBxMGU2VuZGFpMRowGAYDVQQKExFUYWth
cSBIb21lIFNlcnZlcjELMAkGA1UECxMCc2UxGDAWBgNVBAMTD3Rha2FxMS5wbGFs
YS5qcDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQHRha2FxMS5wbGFsYS5qcDAe
Fw0wODAzMjAwNzMzMjNaFw0wOTAzMjAwNzMzMjNaMIGHMQswCQYDVQQGEwJKUDEP
MA0GA1UECBMGTWl5YWdpMRowGAYDVQQKExFUYWthcSBIb21lIFNlcnZlcjELMAkG
A1UECxMCc2UxGDAWBgNVBAMTD3Rha2FxMS5wbGFsYS5qcDEkMCIGCSqGSIb3DQEJ
ARYVdGFrYXFAdGFrYXExLnBsYWxhLmpwMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
iQKBgQDSqJCPpF81lNB2ThbUoR2gP2ZUmm2loOJcSveRpLLkWj+9W8mZnjaElx1Q
irvGiFnHM0od2bTfOdLnaYj9A18N5hR+B16ZZ9FtmLiRCRMED1mHMNEifA5DmI+J
0nPjDICIDQ97C4mCgeigvOm4UbDRWzJfKxnLvLRAoIbzcrKPjwIDAQABo4IBOzCC
ATcwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwLAYJYIZIAYb4QgENBB8W
HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSut54S5iOI
bV/lIKwQLDRWiYa+ZzCByQYDVR0jBIHBMIG+gBQ+kWX2r2iJFbC1KPuyI9Ai4kBc
1KGBoqSBnzCBnDELMAkGA1UEBhMCSlAxDzANBgNVBAgTBk1peWFnaTEPMA0GA1UE
BxMGU2VuZGFpMRowGAYDVQQKExFUYWthcSBIb21lIFNlcnZlcjELMAkGA1UECxMC
c2UxGDAWBgNVBAMTD3Rha2FxMS5wbGFsYS5qcDEoMCYGCSqGSIb3DQEJARYZd2Vi
bWFzdGVyQHRha2FxMS5wbGFsYS5qcIIBADANBgkqhkiG9w0BAQQFAAOBgQAezBv6
EWeTkQnuu9Xp70pYSd2HeyOZSzg11AIO2jtmPeIj+SsNS5p4g19gadu67bu+3N+W
mEgp/tSgHpfHPucIaohNRjxaITASS6cFhxlsbgXVMQaz8CyVTnnSg1+PIfLPaT3S
WczdCoTuD1SLp2444iCGbBqihDzHUVn+bPSd9w==
-----END CERTIFICATE-----
serial -> 下のような内容のファイルだった。(一つ前のファイルが serial.old であった)
04

これは、おそらく次に作成された時につく ID だと思う。
次のようにして新たに作りなおした。本当は別の正しいやり方があると思う。後で調べることにするが、やってみたメモとして残しておく。
(手順知っている方は教えてくれたらうれしいな!!!)
1.index.txt を vi で開き全て削除 してから保存した。( 0 バイトのファイルを作成)
2.newcerts の下にあるファイルを全て削除した。(今回は全部期限切れたので・・・・)
3.serial を vi で開き内容を 4 -> 1 にして保存した。(初期数値のつもり)
4.A個人証明書を利用するユーザーの秘密鍵署名要求書(CSR)の作成。 -> ユーザ
5.B証明書の発行 -> CA
6.C秘密鍵入り個人証明書の作成 -> ユーザー

● 平成20年03月20日(木) 追記 その2

どうやら、「秘密鍵が洩れてしまったり、証明書を作り直したい場合などには、現在使われている証明書を失効し新しい証明書を作り直せばいい」らしい。
次回実際に試してみることにする。

● 平成23年01月07日(金) 追記

下記アドバイスをいただきました。ありがとうごさいます。
デフォルトでは、同じSubjectの証明書発行を禁止しているので、エラーになりますが、

index.txt と同じディレクトリにある index.txt.attr の中を

 unique_subject = yes
     ↓
 unique_subject = no

にすれば、発行できるようになりますよ。

戻る

サイトトップへ