Ubuntuにはopensslがインストールされている。これを使って自己認証局(Private Certificate Authority)を作って、証明書を発行し、サーバの暗号化通信に利用する。

[opensslの設定]
opensslには証明書を発行するためのスクリプト(CA.shおよびCA.pl)が同梱されている。私はCA.shを使うので、手始めにこれを編集する。

$ sudo vi /usr/lib/ssl/misc/CA.sh
# サーバ証明書の有効期限を伸ばす
DAYS="-days 2922"       # 8 year
# ルート証明書の有効期限を伸ばす
CADAYS="-days 7305"     # 20 years
# 自己認証局を置くディレクトリを指定
CATOP=/etc/ssl/CA

次にopensslの設定ファイルを編集した。

$ sudo vi /etc/ssl/openssl.cnf
# 自己認証局を置くディレクトリを指定
CATOP=/etc/ssl/CA
# サーバ証明書の有効期限を伸ばす
default_days    = 2922
# 証明書に記載される情報のデフォルト設定
countryName_default             = JP
stateOrProvinceName_default     = Miyazaki
localityName_default            = Miyakonojo
0.organizationName_default      = College Name
1.organizationName_default      = Department Name
organizationalUnitName_default  = Section Name
emailAddress_default            = myname@mydomain

[自己認証局の作成]
始める前に証明書に使う固有名(Common Name)とパスフレーズを決めておいた方がよい。他の証明書にルート証明書のパスワードは使えないので注意する。

ターミナルから以下のコマンドを実行し、自己認証局の秘密鍵とルート証明書を作成する。秘密鍵ファイルはroot以外は読み込めないようにパーミッションを変更する。

$ sudo /usr/lib/ssl/misc/CA.sh -newca
$ sudo chmod 600 /etc/ssl/CA/private/cakey.pem
$ sudo chmod 700 /etc/ssl/CA/private

必要かどうかさだかではないが、拡張子をcrtにしたルート証明書(PEM形式)とバイナリ変換したDER形式のルート証明書を作成した。

$ sudo openssl x509 -in /etc/ssl/CA/cacert.pem -out /etc/ssl/CA/cacert.crt
$ sudo openssl x509 -inform pem -in /etc/ssl/CA/cacert.pem -outform der -out /etc/ssl/CA/cacert.der

[サーバ証明書の作成]
とりあえずWebサーバ用のサーバ証明書を作成した。始める前に固有名とパスフレーズを決めておく。
まずはサーバ証明書作成の作業ディレクトリを作成し、移動しておく。私は自己認証局(/etc/ssl/CA)の下のcertsディレクトリ内にサーバの固有名のディレクトリを作った。

$ sudo mkdir /etc/ssl/CA/certs/www.mylabo.lan
$ cd /etc/ssl/CA/certs/www.mylabo.lan

以下のコマンドを実行し、サーバ証明書を発行する。秘密鍵ファイルのパーミッションは640に設定した。また拡張子をcrtにしたサーバ証明書も作成した。

$ sudo /usr/lib/ssl/misc/CA.sh -newreq
$ sudo /usr/lib/ssl/misc/CA.sh -sign
$ sudo chmod 640 newkey.pem
$ sudo openssl x509 -in newcert.pem -out server.crt

サーバが秘密鍵を読み込む際には、秘密鍵に設定したパスフレーズを要求される。サーバの自動起動に差し支えがある場合は、以下のようにしてパスフレーズによる保護を解除する。パーミッションは640とした。秘密鍵のパスフレーズ保護を解除するが心配な場合は、各サーバでパスフレーズを処理する方法があるようだ。

$ sudo openssl rsa -in newkey.pem -out newkey_nopass.pem
$ sudo chmod 640 newkey_nopass.pem

[クライアント証明書の作成]
基本的にはサーバ証明書の作成と同じ。固有名と秘密鍵のパスフレーズを決めておく。

$ sudo mkdir /etc/ssl/CA/certs/client
$ sudo /usr/lib/ssl/misc/CA.sh -newreq
$ sudo /usr/lib/ssl/misc/CA.sh -sign 
$ sudo chmod 640 newkey.pem

ここで発行したクライアント証明書と秘密鍵、およびルート証明書をクライアントに渡す必要がある。3つのファイルをコピーして渡しても使えるようだけど、一つのファイルにまとめて渡す方が便利だし、パスフレーズによる保護もかけられるので安全なようだ。

$ sudo openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -certfile /etc/ssl/CA/cacert.crt -out client.p12

コメントを残す