12
09
2007
LeopardサーバのRADIUS #4 : PKI証明書の作成
PKI証明書の運用
IEEE802.1X認証システムを起ち上げるには、PKIによる証明書を準備しなければなりません.Mac OS X サーバの場合はGUIベースの”Server Admin”ツールから比較的簡単に自己署名形式のサーバ証明書を組み込むことが可能です.また、Mac OS X では標準で組み込まれている”Keychain Access” ユーティリティーによって、各種PKI証明書をハンドリングできるようになっています.
今回は、PKI認証の仕組みを理解しやすくするため、敢えてこれらのGUIベースのツールを使わずに、OpenSSL のコマンドラインから各種の証明書を作成し、802.1X認証システムを運用してみることにします.
OpenSSL
OpenSSLはオープンソースベースのPKI認証システムとして最も広く使われており、Mac OS X でもこのOpenSSLが使われています.PKIの仕組みを理解するのは結構大変なのですが、PKIの仕組みについては書籍などを参考にして貰うとして、ここでは簡単にPKIの仕組みを説明しておきます.
PKIと証明書
PKI(Public Key Infrastructure)では、公開鍵と秘密鍵という一対の暗号鍵を利用しています.これらの2つの鍵のうちのどちらか一方で暗号化された文書は、もう一方の鍵でしか復号化できないという性質があります.データの所有者が片方の鍵(秘密鍵)で暗号化し、もう一方の鍵(公開鍵)を公開します.
秘密鍵で暗号化されたデータは、対になっている公開鍵でしか復号化できないので、そのデータの出所を証明することになります.通常、証明書にはユーザの情報(公開鍵の情報や有効期限など)を認証局(CA : Certificate Authority)の秘密鍵で暗号化した情報が書き込まれています.通常、認証局の公開鍵はルートCAとしてMac OS X やWindowsの中に組み込まれていますので、このルートCAの公開鍵で復号化することによって、この証明書が認証局によって署名・発行されたものであることが証明されます.
グローバル証明書とプライベート証明書
外部公開WEBサーバなどを運用する場合は、グローバル証明書と呼ばれるVerisignやRSAなどのきちんとオーソライズされた認証機関により署名されたサーバ証明書を手配する必要がありますが、これらのサービスは有料で高価なうえ、証明書取得のための手続きも面倒で厄介です.無線LAN等の認証用途に使うのであれば、これらのオーソライズされた証明書でなくても、自分で勝手に認証局を起ち上げて、証明書に署名するだけで簡単にPKI認証システムの運用が可能です.このように組織の内部だけで運用するような証明書をプライベート証明書と呼んでいます.
OpenSSLによるPKIシステムの構築
Mac OS X の場合、OpenSSL関係のファイルは “/System/Library/OpenSSL” 配下に置かれています.Mac OS X Serverでは サーバ関係の証明書は “/etc/certificates” 配下に置かれています.
プライベート認証局(CA)の作成
認証局を作成するというと何か特別なサービスを提供するというイメージがありますが、単にCA証明書を作成するだけです.”/System/Library/OpenSSL/misc”というディレクトリに “CA.pl”と”CA.sh”という2つののスクリプトがあります.これらのスクリプトは認証局を作成したり証明書を作成するために用意されています.Perlスクリプトとshellスクリプトのどちらを用いても処理内容は同じです.
sh-3.2# cd /System/Library/OpenSSL/misc
sh-3.2# ls -la
total 56
drwxr-xr-x 11 root wheel 374 Nov 30 23:51 .
drwxr-xr-x 6 root wheel 204 Nov 30 23:35 ..
-rwxr-xr-x 1 root wheel 5502 Sep 24 08:23 CA.pl
-rwxr-xr-x 1 root wheel 3583 Sep 24 08:23 CA.sh
-rwxr-xr-x 1 root wheel 119 Sep 24 08:23 c_hash
-rwxr-xr-x 1 root wheel 152 Sep 24 08:23 c_info
-rwxr-xr-x 1 root wheel 112 Sep 24 08:23 c_issuer
-rwxr-xr-x 1 root wheel 110 Sep 24 08:23 c_name
drwxr-xr-x 13 root wheel 442 Nov 30 23:48 demoCA
このスクリプトでは、このスクリプトが置かれている同じディレクトリに”demoCA”という名前のディレクトリを置き、そこに各種のファイルを作成するようになっています.このままでも良いのですが、今回は専用のディレクトリを用意し、そこに各種のファイルを作成するようにします.とりあえず、myCAとでもしておきます.
CATOP=./demoCA ← CATOP=./myCA
CAKEY=./cakey.pem
CACERT=./cacert.pem
上記の例は シェルスクリプト”CA.sh”の場合で、Perlスクリプト “CA.pl”の場合は $CATOPのように先頭に$が付きます.同様に、opensslコマンドの設定ファイル “/System/Library/OpenSSL/openssl.cnf” の内容も書き換えます.先頭から37行目辺りにある “[ CA_default ]” セクションの “dir “という項目を修正します.
[ CA_default ]
dir = ./myCA # 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.
認証局(CA)を作るには、”openssl.cnf” の “[ usr_cert ]” セクションにある、 “nsCertType=”の項目を全てコメントアウト(先頭に#を付ける)しておきます.”[ v3_ca ]” セクションに
nsCertType = sslCA,emailCA というラインを追加します.これで認証局(CA) を作成する準備が整いました.
[ v3_ca ]
nsCertType = sslCA, emailCA ← 追加する
“/System/Library/OpenSSL/misc” ディレクトリに移動し、”-newca” という引数を付けてスクリプトを実行します.
sh-3.2# ./CA.pl -newca
CA certificate filename (or enter to create) ← 何も入力せずに"return"キーを押す
Making CA certificate ...
Generating a 1024 bit RSA private key
.........................................++++++
........................................++++++
writing new private key to './myCA/private/cakey.pem'
Enter PEM pass phrase: ← CA用の秘密鍵パスフレーズを入力
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) [AU]:JP ← 国名 JP
State or Province Name (full name) [Some-State]:Kanagawa ← 州、県名など
Locality Name (eg, city) []:Sagamihara ← 都市名など
Organization Name (eg, company) [Internet Widgits Pty Ltd]:y2itec ← 組織名
Organizational Unit Name (eg, section) []:Lab. ← 部署名
Common Name (eg, YOUR name) []:y2itec ← 認証局の名前
Email Address []:admin@y2tech.net ← 認証局の管理者のメール
sh-3.2#
sh-3.2# ls -la myCA
total 16
drwxr-xr-x 9 root wheel 306 Dec 8 22:45 .
drwxr-xr-x 9 root wheel 306 Dec 8 22:41 ..
-rw-r--r-- 1 root wheel 1298 Dec 8 22:45 cacert.pem ← CA証明書
drwxr-xr-x 2 root wheel 68 Dec 8 22:41 certs
drwxr-xr-x 2 root wheel 68 Dec 8 22:41 crl
-rw-r--r-- 1 root wheel 0 Dec 8 22:41 index.txt
drwxr-xr-x 2 root wheel 68 Dec 8 22:41 newcerts ← この中にCAの秘密鍵 "cakey.pem" が置かれている
drwxr-xr-x 3 root wheel 102 Dec 8 22:41 private
-rw-r--r-- 1 root wheel 17 Dec 8 22:45 serial
sh-3.2#
サーバ証明書の発行
サーバ証明書を発行するには、まずサーバ証明書申請用のファイル(CSR)を作成します.次に、このサーバ証明書申請ファイルに、先ほど作成した認証局(CA)の秘密鍵を用いて署名します.この署名された証明書がサーバの証明書となります.シェルスクリプトを実行する前に、”openssl.cnf” の “[ user_cert ]” セクションにある “nsCertType = server” のコメントを解除して、他の “nsCertType”を全てコメントにします.
sh-3.2# ./CA.pl -newreq ← 証明書発行要求
Generating a 1024 bit RSA private key
...................................++++++
.............................++++++
writing new private key to 'newkey.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) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Sagamihara
Organization Name (eg, company) [Internet Widgits Pty Ltd]:y2itec
Organizational Unit Name (eg, section) []:Home
Common Name (eg, YOUR name) []:server2.home.yoko ← サーバのFQDN
Email Address []:admin@y2tech.net
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← 何も入力せずに"return"キー
An optional company name []: ← 同上
Request is in newreq.pem, private key is in newkey.pem
“newreq.pem” という署名要求ファイル(CSR)と “newkey.pem” というサーバ秘密鍵ファイルが作成されます.引き続き認証局(CA)による署名手続きを行います.
sh-3.2# ./CA.pl -sign ← 署名手続きを実行
Using configuration from /System/Library/OpenSSL/openssl.cnf
Enter pass phrase for ./myCA/private/cakey.pem: ← 認証局の秘密鍵パスフレーズを入力
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
93:3f:af:8b:b1:51:e6:55
Validity
Not Before: Dec 8 14:39:13 2007 GMT
Not After : Dec 7 14:39:13 2008 GMT
Subject:
countryName = JP
stateOrProvinceName = Kanagawa
localityName = Sagamihara
organizationName = 2itec
organizationalUnitName = Home
commonName = server2.home.yoko
emailAddress = admin@y2tech.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
DD:15:CB:CC:D3:31:65:16:E9:10:89:A2:E7:D9:B5:E0:D0:A3:F3:5E
X509v3 Authority Key Identifier:
keyid:C5:AF:D1:2F:89:13:20:3D:82:D6:7F:83:EA:74:F3:B0:CF:23:B3:46
DirName:/C=JP/ST=Kanagawa/L=Sagamihara/O=y2itec/OU=Lab./CN=y2itec/emailAddress=admin@y2tech.net
serial:93:3F:AF:8B:B1:51:E6:54
Certificate is to be certified until Dec 7 14:39:13 2008 GMT (365 days)
Sign the certificate? [y/n]:y ← 署名する(Yes)
1 out of 1 certificate requests certified, commit? [y/n]y ← 上記内容を確認し実行(yes)
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
問題が無ければ “newcert.pem” というCAにより署名されたサーバ証明書が作成されます.先ほどの”newreq.pem”, “newkey.pem” とともに、サーバの証明書であることが判るように名前を付けたディレクトリを作成して、その中にこれらのファイルを移しておいて下さい.この後のクライアント証明書の作成でも同じファイル名が使われるので、作成したファイルを別な場所に待避させておく必要があります.尚、サーバの秘密鍵は他人がアクセスできないように厳重に保管しておいて下さい.
クライアント証明書の発行
クライアント証明書の発行手続きもサーバの場合と同じような手続きを踏みます.”openssl.cnf”ファイルの “[ user_cert ]” セクションにある “nsCertType = ” を “nsCertType = client, email” として下さい.後の手続きは先ほどのサーバの場合と同じです.
sh-3.2# ./CA.pl -newreq
Generating a 1024 bit RSA private key
.....++++++
.....++++++
writing new private key to 'newkey.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) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Sagamihara
Organization Name (eg, company) [Internet Widgits Pty Ltd]:y2itec
Organizational Unit Name (eg, section) []:Home
Common Name (eg, YOUR name) []:jukebox ← ここではユーザの名前(アカウント名)を用いた
Email Address []:jukebox@y2tech.net ← ユーザのメールアドレス
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
sh-3.2# ./CA.pl -sign ← 署名手続きを実行
Using configuration from /System/Library/OpenSSL/openssl.cnf
Enter pass phrase for ./myCA/private/cakey.pem:
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
93:3f:af:8b:b1:51:e6:56
Validity
Not Before: Dec 8 14:50:47 2007 GMT
Not After : Dec 7 14:50:47 2008 GMT
Subject:
countryName = JP
stateOrProvinceName = Kanagawa
localityName = Sagamihara
organizationName = y2itec
organizationalUnitName = Home
commonName = jukebox
emailAddress = jukebox@y2tech.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
91:A4:D7:45:2B:41:FB:82:D6:54:93:EC:F8:2F:83:ED:AF:C1:E8:3E
X509v3 Authority Key Identifier:
keyid:C5:AF:D1:2F:89:13:20:3D:82:D6:7F:83:EA:74:F3:B0:CF:23:B3:46
DirName:/C=JP/ST=Kanagawa/L=Sagamihara/O=y2itec/OU=Lab./CN=y2itec/emailAddress=admin@y2tech.net
serial:93:3F:AF:8B:B1:51:E6:54
Certificate is to be certified until Dec 7 14:50:47 2008 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
サーバの場合と同じように、クライアントのCA署名済み証明書、署名要求(CSR)、秘密鍵が作成されます.先程と同じように別なディレクトリを用意して、そこに作成された証明書類を移しておきます.
以上でクライアント証明書の発行手続きは終わりましたが、クライアントに署名済み証明書と秘密鍵、CA証明書を配布する必要があります.これらのファイルを別々に管理するのは厄介ですので、PKCS#12形式という鍵と証明書を一つにまとめて取り扱うことのできるファイル形式に変換しておきます.
ユーザ証明書が置かれているディレクトリで、次のopensslコマンドを実行します.ここではCA証明書も一緒に含めてあります.ユーザはこのPKCS#12形式のファイルをクライアントマシンにインストールします.Mac OS X の場合”keychain” がこれらの証明書を統合的に管理しています.
sh-3.2# openssl pkcs12 -export -inkey newkey.pem -in newcert.pem -certfile ../myCA/cacert.crt
-name "jukebox" -out newcert.pkcs12 (上の行の続き:実際は1行)
Enter pass phrase for newkey.pem: ← ユーザの秘密鍵パスフレーズ
Enter Export Password: ← このPKCS#12形式ファイルを開くためのパスワード
Verifying - Enter Export Password:
sh-3.2# ls -la
total 32
drwxr-xr-x 6 root wheel 204 Dec 9 00:02 .
drwxr-xr-x 11 root wheel 374 Dec 8 23:52 ..
-rw-r--r-- 1 root wheel 3773 Dec 8 23:50 newcert.pem
-rw-r--r-- 1 root wheel 3004 Dec 9 00:04 newcert.pkcs12 ← pkcs12形式の配布ファイル
-rw-r--r-- 1 root wheel 963 Dec 8 23:49 newkey.pem
-rw-r--r-- 1 root wheel 700 Dec 8 23:49 newreq.pem
今回は、OpenSSLのコマンドラインから各種のPKI証明書を作成しましたが、次回はこれらの証明書をサーバやクライアントマシンに設定する例を紹介したいと思います.