OpenSSLで自己認証局と証明書の作成

メモ:

まず、OpenSSLがインストールされているとして進めます。

本来、信頼のある認証局に認証してもらいますが今回は、自分で認証するための自己認証局を作成します。CAの作成は、/usr/local/ssl/CAに作成するため、あらかじめディレクトリを作成しておきます。

OpenSSLがインストールされているディレクトリにある misc ディレクトリに CA.sh というスクリプトがあります。このスクリプトで認証局を構築することができます。

CA.shをCAの作成場所にコピーします。

cp CA.sh /usr/local/ssl/CA

構築する場所等を変更するためスクリプトを少し修正します。

openssl.cnfの[CA_default]-dirも同様に修正します。

DAYS="-day 3650"

CATOP=/usr/local/ssl/CA
CAKEY=./cakey.pem
CACERT=./cacert.pem

これで、認証局の構築準備ができたので次のスクリプトを実行します。

CA.sh -newca

スクリプト内部では、ディレクトリの作成とコマンドが実行されます。

openssl req -new -x509 -keyout /usr/local/CA/private/cakey.pem \
-out /usr/local/CA/cacert.pem -days 3650

コマンドを実行すると、以下のように入力が求められます。

CA certificate filename (or enter to create) 【Enter】
Making CA certificate ...
Using configuration from /usr/local/ssl/openssl.cnf
Generating a 1024 bit RSA private key
..........................++++++
...............................++++++
writing new private key to './demoCA/private/./cakey.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 Namer or a DN.
There are quite a few fields bur 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]:【Tokyo:都道府県名】
Locality Name (eg, city)[]:【Chofu-shi:市区町村】
Organization Name(eg, company)[Internet Widgits Pty Ltd]:【bnote:組織名(法人名)】
Organization Unit Name (eg, section)[]:【System:部署名】
Common Name (eg, your name or your server's hostname)[]:【bnote.sample.jp:サーバのホスト名(FQDN)等】
Email Address []:【master@sample.jp:メールアドレス】

これで /usr/local/CA に認証局の証明書(cacert.pem)と /usr/local/CA/private に認証局の秘密鍵(cakey.pem)が作成されます。

作成した証明書は、以下のコマンドで内容が確認できます。

openssl x509 -in cacert.pem -text

この証明書をバイナリー(DER)フォーマットにするには、次のコマンドを実行します。

openssl x509 -in cacert.pem -outform DER -out cacert.der

バイナリーにする方法にはBER,DER,PERなどがあるそうです。

参考:デジタル証明書の形式

PEMとはメールを暗号化するために規定されたものです。

PEMにおいては暗号化情報をメールで送るためにこれをテキスト形式で表現します。この暗号化情報のテキスト形式のことをPEM形式と呼びます。多くの場合、DER形式のX509証明書をこのPEM形式に変換したものが用いられるようです。

証明書、CSR、および暗号化鍵のいずれも、 base64でエンコードにより作られるこの形式で保存することができます。このテキスト形式のファイルはHTTPサーバなどでも、この形式のファイルを使う場合が多いようです。

サーバの秘密鍵を作成する

サーバの秘密鍵や証明書は、/usr/local/ssl/SERVERに作成することとします。

mkdir /usr/local/ssl/SERVER
chmod 600 /usr/local/ssl/SERVER
openssl genrsa -rand 適当なFile -des3 -out serverkey.pem 1024
又は
openssl genrsa -des3 -out serverkey.pem 1024

コマンドを実行すると、以下のように入力を求められます。

Enter PEM pass phrase:(パスフレーズ入力)

Verifying password - Enter PEM pass phrase:(パスフレーズ再入力)

これで、サーバの秘密鍵の完成です。

Apacheで使用する場合、Apacheを起動するたびにパスフレーズが必要となるので、パスフレーズを解除します。(セキュリティー上好ましくはないですね。)

openssl rsa -in serverkey.pem -out servernopasskey.pem

これでパスフレーズの外れた秘密鍵が出来上がります。

認証局への署名要求書(CSR,申請書)を作成する

先ほど作成したサーバ鍵を基に認証局への署名要求書ファイルを作成します。認証局は、この署名要求書ファイルを基に署名付の証明書を作成してくれます。

openssl req -new -days 365 -key serverkey.pem -out csr.pem

コマンドを実行すると以下のように入力を求められます。(同一ホストの自己認証局を利用する場合は、以下の情報はCA構築時とまったく同じ内容で作成してください)

Country Name (2 letter code)[AU]: 【JP:国名】
State or Province Name (full name)[Some-State]:【Tokyo:都道府県名】
Locality Name (eg, city)[]:【Chofu-shi:市区町村】
Organization Name(eg, company)[Internet Widgits Pty Ltd]:【bnote:組織名(法人名)】
Organization Unit Name (eg, section)[]:【System:部署名】
Common Name (eg, your name or your server's hostname)[]:【bnote.sample.jp:サーバのホスト名(FQDN)等】
Email Address []:【master@sample.jp:メールアドレス】

これで署名要求書の作成は終了です。

次は、ここで作成した署名要求書を基にCAに署名して証明書を発行してもらいます。

サーバ証明書の作成

先ほど作成したサーバの署名要求書を基にCA(自己認証局)が署名し、サーバの証明書を作成します。

cd /usr/local/ssl/CA
openssl ca -in /usr/local/ssl/SERVER/csr.pem -keyfile \
private/cakey.pem -cert cacert.pem -out /usr/local/ssl/SERVER/cert.pem

これでサーバ証明書の作成は終了です。

apacheで使用する

Apache 2系はconfigureでenable-sslを指定してコンパイルしてください。

Apache 1.3系はmod_sslを入手してコンパイルしてください。

下記例は1.3系です。

/usr/local/apache/confにあるhttpd.confを編集します。

SSLEngine on
SSLCertificateFile /usr/local/ssl/SERVER/cert.pem
SSLCertificateKeyFile /usr/local/ssl/SERVER/servernopasskey.pem

とりあえず、ApacheのSSLの設定は終了です。

あとは、/usr/local/apache/bin/apachectl startsslでSSLを有効にしてApacheを起動します。