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を起動します。