キャッチ

当然、ちゃんとした認証局に証明してもらい、SSLサイトを構築するのが基本ではありますが、

  • 仮のサイトである
  • イントラのサイトである

等のやむを得ない場合に、 自己証明書と自己証明局を使ったSSLサイトを構築 するシーンはあるわけです。

ここでは作成した自己証明局(ルートCA、中間CA)を使って自己証明書を発行し、Apache等への設定、クライアントへの配布までを記述します。

1.OpenSSLの準備

OpenSSLがインストールされていることを確認しておきます。

# openssl version
OpenSSL 1.0.x

代表的なインストール先ディレクトリを挙げておきます。

/usr/local/ssl      ※ここではここにある前提とします。
/etc/ssl/
/usr/share/ssl/
/etc/pki/tls/       ※Amazon Linuxではココでした。

2.証明局(CA)とサーバ証明書の作成

証明書は認可方式であり、外部の世界的に信頼のおける機関に審査してもらい証明書を発行してもらう必要があります。 この発行機関のことを認証局(CA:Certificate Authority)といいます。 認証局の中でもクライアントに初期バンドルされている最上位の認証局は ルート認証局(ルートCA) と言われ、 一般的にルート認証局から証明された 中間認証局(中間CA) が署名する形で証明書が発行されます。

ここではそれらを自己で模擬する形で、ルートCAを作成し、ルートCAが署名した中間CAを作成し、中間CAが署名したサーバ証明書を作成します。

ルートCAの作成

ルートCA用の設定ファイル(openssl_rca.cnf)を作成します。

cd /usr/local/ssl
mkdir RCA
cp openssl.cnf openssl_rca.cnf
vi openssl_rca.cnf
# 42行目あたり
dir = /usr/local/ssl/RCA # Where everything is kept
# 73行目あたり
default_days = 3650 # how long to certify for
# 178行目あたり、コメントアウトを削除
nsCertType = server
# 250行目あたり、コメントアウトを削除
nsCertType = sslCA, emailCA
# 332行目あたり
dir = /usr/local/ssl/RCA # TSA root directory

ルートCA用の生成スクリプト(RCA)を作成します。

cd /usr/local/ssl/misc/
cp CA RCA
vi RCA
# 31行目あたりに追加
CATOP=/usr/local/ssl/RCA
SSLEAY_CONFIG="-config /usr/local/ssl/openssl_rca.cnf"

ここから実際の作成作業になります。

# /usr/local/ssl/misc/RCA -newca

CA certificate filename (or enter to create)
⇢ここはリターンでOK

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇢ここはパスワードを入力

以下は適当に入力。
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato
Organization Name (eg, company) [Default Company Ltd]:hoge.co.jp
Organizational Unit Name (eg, section) []:Network
Common Name (eg, your name or your server's hostname) []:hoge.co.jp
Email Address []:hoge@hoge.co.jp
A challenge password []:
An optional company name []:

Enter pass phrase for /usr/local/ssl/RCA/private/./cakey.pem:
⇢ここはパスワードを入力

Signature ok
(省略)
Write out database with 1 new entries
Data Base Updated

配布用のderファイルを作成します。

cd /usr/local/ssl/RCA
openssl x509 -inform pem -in cacert.pem -outform der -out rca.der

中間CAの作成

中間CA用の設定ファイル(openssl_rca.cnf)を作成します。

cd /usr/local/ssl
mkdir ICA
cp openssl_rca.cnf openssl_ica.cnf
vi openssl_ica.cnf
# 42行目あたり
dir = /usr/local/ssl/ICA # Where everything is kept
# 332行目あたり
dir = /usr/local/ssl/ICA # TSA root directory

中間CA用の生成スクリプト(ICA)を作成します。

cd /usr/local/ssl/misc
cp RCA ICA
vi ICA
# 35行目あたり
CATOP=/usr/local/ssl/ICA
SSLEAY_CONFIG="-config /usr/local/ssl/openssl_ica.cnf"

ここから実際の作成作業になります。まずは中間CAのルートCAに対する申請書(newkey.pem)を作成します。

cd /usr/local/ssl/ICA
/usr/local/ssl/misc/ICA -newreq

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
⇢ここはパスワードを入力

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato
Organization Name (eg, company) [Default Company Ltd]:hoge.co.jp ICA
Organizational Unit Name (eg, section) []:Network
Common Name (eg, your name or your server's hostname) []:hoge.co.jp ICA
Email Address []:hoge@hoge.co.jp

A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem

作成した申請書(newkey.pem)をルートCAが署名し、中間CA(ica.crt)を作成します。

cd /usr/local/ssl/ICA
/usr/local/ssl/misc/RCA -signCA
⇢パスワード入力し、Y、Yでnewcert.pemが作成される。

/usr/local/ssl/misc/ICA -newca
CA certificate filename (or enter to create)
⇢/usr/local/ssl/ICA/newcert.pem を指定する。

cd /usr/local/ssl/ICA
mv newkey.pem private/cakey.pem
openssl x509 -in newcert.pem -out ica.crt

配布用のderファイルを作成します。

openssl x509 -inform pem -in cacert.pem -outform der -out ica.der

サーバ証明書の作成

ルートCA署名済の中間CAに申請する形でサーバ証明書を作成します。 まずは秘密鍵(newkey.pem)を作成します。

cd /usr/local/ssl/private
openssl genrsa -aes256 2048 > newkey.pem
# バックアップ取得
cp newkey.pem newkey.pem.org 
# パスワードレスにするおまじない
openssl rsa -in newkey.pem -out newkey.pem

※やり直しの場合は、ICAディレクトリのindex.txtの中身を空にしておく。

CSR(署名要求 newreq.pem)を作成します。

openssl req -new -key newkey.pem -out newreq.pem

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato
Organization Name (eg, company) [Default Company Ltd]:hoge.co.jp
Organizational Unit Name (eg, section) []:Development
Common Name (eg, your name or your server's hostname) []:<実際に使うサーバホスト名を指定します。例:www.hoge.co.jp>
Email Address []:hoge@hoge.co.jp

A challenge password []:
An optional company name []:

中間CA(ICA)を使って署名を実施します。

cd /usr/local/ssl/private
/usr/local/ssl/misc/ICA -sign
⇢パスワードとyy

実際に設定に使う証明書の形式(server.crt)にしておきます。秘密鍵の名称もわかりやすく(server.key)しておきます。

mv /usr/local/ssl/private/newcert.pem /usr/local/ssl/certs
cd /usr/local/ssl/certs
openssl x509 -in newcert.pem -out server.crt
cd /usr/local/ssl/private
mv newkey.pem server.key

作成したファイル

いくつか中間ファイルがあって混乱しますので、以下に最終的に必要なファイルをまとめておきます。

/usr/local/ssl/private/server.key ... サーバの秘密鍵
/usr/local/ssl/certs/server.crt   ... サーバの証明書(中間CAで署名済)
/usr/local/ssl/ICA/ica.crt        ... 中間CA証明書(ルートCAで署名済)
/usr/local/ssl/RCA/rca.der        ... クライアント配布用のルートCA証明書
/usr/local/ssl/ICA/ica.der        ... クライアント配布用の中間CA証明書

3.Webサーバに証明書設定

Apache2

設定ファイル(ssl.conf)を変更します。

vi /etc/httpd/conf.d/ssl.conf
# 105行目あたり
SSLCertificateFile /usr/local/ssl/certs/server.crt
# 112行目あたり
SSLCertificateKeyFile /usr/local/ssl/private/server.key
# 121行目あたり
SSLCertificateChainFile /usr/local/ssl/ICA/ica.crt

再起動すると適用されます。

NGINX

Apacheと異なり、中間CAの証明書はChainFileとして別途指定するのではなく ファイル連結したファイルを使います。

cd /usr/local/ssl
cat certs/server.crt ICA/ica.crt > certs/server.nginx.crt
vi /etc/nginx/conf.d/xxxx.conf
ssl_certificate /usr/local/ssl/certs/server.nginx.crt;
ssl_certificate_key /usr/local/ssl/private/server.key;

再起動すると適用されます。

4.クライアントに証明局のインストール

上記で生成したサイトはSSL接続が可能ですが、信頼された証明局による署名がないために警告が発生します。 各クライアントで以下の手順で証明局をインストールすることで警告がでなくなります。

  • rca.der と ica.der を配布する。
  • rca.derをダブルクリックして証明書のインストールする。
    • 現在のユーザで証明書のストアを信頼されたルート証明機関を指定する。
  • ica.derをダブルクリックして証明書のインストールする。  - こちらは自動的でOK。

※FireFoxの場合には別途ブラウザで登録設定する必要があります。