Contents
Overview
easy-rsa を使用して自己署名証明書を作成します。easy-rsa は OpenSSL コマンドを整理して簡略化したスクリプトです。OpenSSL コマンドは作業ディレクトリが複数に跨ってコマンドが長くなるケース、手順が多くなるケースがありますが、easy-rsa はそれらを扱いやすくしたスクリプトです。また、OpenSSL コマンドには多くのオプションがありますが、通常運用においては easy-rsa で十分だと思いますし、証明書の確認等は結局 OpenSSL コマンドを使用します。
easy-rsa は、元々は OpenVPN の証明書作成ツールとして良く紹介されていましたが、OpenVPN 以外の用途でも問題ありません。おそらくですが、中間証明書は標準的な使い方では作れないと思っています。
前提条件
インストール
easy-rsa をインストールします。
myadmin@ubuntu:~$ sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install easy-rsa
実行ファイルの配置
easy-rsa の実行ファイルを配置します。easy-rsa の実行ファイルは /usr/share/easy-rsa
にインストールされています。下記の配置先は一例となりますので自由に配置してもらって構いません。以前、easy-rsa のバージョンアップに追随できるようにと /usr/share/easy-rsa のシンボリックリンクを作成する方法をとっていましたが、vars が読み込まれない問題があり、現在はシンプルにコピーして使用しています。
myadmin@ubuntu:~$ cp -a /usr/share/easy-rsa ~/work/easy-rsa
vars
vars は easy-rsa の実行時に読み込まれる変数です。
デフォルト値
デフォルト値は下記の通りです。
myadmin@ubuntu:~$ grep -v -e '^\s*#' -e '^\s*$' ~/work/easy-rsa/vars.example | expand | tr -s [:space:] | sed 's/^ / /g'
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
echo "This is no longer necessary and is disallowed. See the section called" >&2
echo "'How to use this file' near the top comments for more details." >&2
return 1
fi
設定値
設定ファイルを作成します。vars が正しく読み込まれる状態であればここで設定した値がデフォルト値となります。CERT_EXPIRE (証明書の有効期限)を 3650 日としています。EASYRSA_CRL_DAYS も 3650 日にしていますが、これは CRL を読み込ませるアプリケーションにのみ関係し、CRL の有効期限を経過すると全ての接続が不可となるためです。CRL のデフォルトの有効期限は 180 日となりますが、短い期間での CRL 管理が必要でなければ、3650 日で良いと思います。
myadmin@ubuntu:~$ tee ~/work/easy-rsa/vars <<"EOF"
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
echo "This is no longer necessary and is disallowed. See the section called" >&2
echo "'How to use this file' near the top comments for more details." >&2
return 1
fi
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "Province"
set_var EASYRSA_REQ_CITY "City"
set_var EASYRSA_REQ_ORG "si1230.com"
set_var EASYRSA_REQ_EMAIL "myadmin@si1230.com"
set_var EASYRSA_REQ_OU "administrator"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_CRL_DAYS 3650
set_var EASYRSA_CERT_RENEW 30
set_var EASYRSA_DIGEST "sha512"
EOF
以下は、エドワーズ曲線 (ECC) を使用する例です。前述の RSA では多くの条件に適合するため、汎用性が高いですが、暗号強度としてはエドワーズ曲線の方が高く、且つ高速です。これは OpenVPN などの VPN で使用すると良いでしょう。本稿では前述の RSA を前提に以降の手順も記載していますが、エドワーズ曲線を使用する場合でも特にコマンドは変わりません。
myadmin@ubuntu:~$ tee ~/work/easy-rsa/vars <<"EOF"
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA 'vars' file." >&2
echo "This is no longer necessary and is disallowed. See the section called" >&2
echo "'How to use this file' near the top comments for more details." >&2
return 1
fi
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "Province"
set_var EASYRSA_REQ_CITY "City"
set_var EASYRSA_REQ_ORG "si1230.com"
set_var EASYRSA_REQ_EMAIL "myadmin@si1230.com"
set_var EASYRSA_REQ_OU "administrator"
set_var EASYRSA_ALGO ed
set_var EASYRSA_CURVE ed25519
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_CRL_DAYS 3650
set_var EASYRSA_CERT_RENEW 30
set_var EASYRSA_DIGEST "sha512"
EOF
作業用ディレクトリに移動
easy-rsa コマンドは実行ファイルが存在するディレクトリ内で実行する必要があるため移動します。
myadmin@ubuntu:~$ cd ~/work/easy-rsa
PKI ディレクトリの初期化
init-pki コマンドで初期化されます。実行すると作成済みの証明書が全て削除されますので注意しましょう。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa init-pki
ルート証明書の作成
ルート証明書を作成します。これは認証局の作成そのものです。ここで指定するパスワードは以降の証明書管理で必要になります。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa build-ca
Enter New CA Key Passphrase: password
Re-Enter New CA Key Passphrase: password
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: si1230.com CA
myadmin@ubuntu:~/work/easy-rsa$ openssl x509 -text -noout -in ~/work/easy-rsa/pki/ca.crt
サーバー証明書の作成
サーバー証明書を作成します。用途別にいくつか例示します。
ワイルドカード証明書
ワイルドカード証明書を作成します。証明書の Common Name はクライアントが接続する際の FQDN と一致する必要がありますが、例えば www.si1230.com, ldap.si1230.com が存在する場合は、2 つの証明書を作成して管理する必要があります。ワイルドカード証明書にすることで単一の証明書で同一ドメインの証明書を管理することができ便利です。ワイルドカード証明書はサブドメインは含まれないことに注意しましょう。例えば、www.sub.si1230.com, www.si1230.com は単一のワイルドカード証明書を使用できません。
alt-name (SAN) を利用すると複数のドメイン名や IP アドレスを含めることができます。さらに最近は Common Name は非推奨とするアプリケーションも存在するため、事実上、必須と考えて良いでしょう。証明書の有効期限は、Apple 製品等の証明書の有効期限を厳密に確認するクライアントに対応する為、デフォルト値の 3650 日から 365 日に変更しています。
build-server-full コマンドは Common Name で指定した FQDN がそのまま証明書のファイル名になり、ワイルドカード証明書では *.si1230.com.crt となってしまいます。このままでも問題ありませんが、コマンドで扱いづらいためリネームしておくと良いかもしれません。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa --subject-alt-name="DNS:*.si1230.com" --days=365 build-server-full *.si1230.com nopass
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
myadmin@ubuntu:~/work/easy-rsa$ openssl x509 -text -noout -in ~/work/easy-rsa/pki/issued/\*.si1230.com.crt
個別のサーバー証明書
個別のサーバー証明書を作成します。とは言ってもワイルドカード証明書の作成方法と特に変わりません。ここでは例として LDAP サーバー用の証明書を作成します。有効期限はデフォルト値の 3650 日をそのまま使用するため、指定していません。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa --subject-alt-name="DNS:ldap.si1230.com" build-server-full ldap.si1230.com nopass
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
myadmin@ubuntu:~/work/easy-rsa$ openssl x509 -text -noout -in ~/work/easy-rsa/pki/issued/ldap.si1230.com.crt
補足として、–subject-alt-name には , 区切りで複数の設定値を指定できますが、必要最低限にしたほうが良いのと、IP アドレスはできるだけ使わないほうが良いと思います。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa --subject-alt-name='DNS:ldap.si1230.com,DNS:ldaps.si1230.com,IP:10.0.0.38' gen-req server nopass
証明書廃止リストの作成
証明書廃止リスト (CRL) は、証明書の有効性をチェックする為のリストです。例えば、VyOS の OpenVPN でリモートアクセスを使用していて、メンバーの離職等で有効期限前に発行した証明書を無効化したい場合、CRL を作成して読み込ませる必要があります。OpenVPN は VPN 設定を行う過程で CRL が必要になる為、dummy のクライアント証明書を失効させて CRL を作成します。
クライアント証明書の作成
dummy のクライアント証明書を作成します。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa build-client-full dummy nopass
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
クライアント証明書の失効
dummy のクライアント証明書を失効します。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa revoke dummy
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
証明書廃止リストの作成
証明書廃止リストを作成します。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa gen-crl
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
Diffie-Hellman グループパラメータ
Diffie-Hellman (DH) グループパラメータを作成します。このパラメータも VyOS の OpenVPN で必要になりますが、ECC を使用している場合は不要です。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa gen-dh
クライアント証明書
クライアント証明書を作成します。クライアント証明書の作成には build-client-full コマンドを使用しますが、サーバー証明書で使用した build-server-full コマンドと使い方は同じです。クライアント証明書に –subject-alt-name は不要ですが、ここではサーバー証明書を一貫性を持たせるために設定しているだけです。
myadmin@ubuntu:~/work/easy-rsa$ ./easyrsa --subject-alt-name="DNS:client.si1230.com" build-client-full client.si1230.com nopass
Enter pass phrase for /home/myadmin/work/easy-rsa/pki/private/ca.key: password
myadmin@ubuntu:~/work/easy-rsa$ openssl x509 -text -noout -in ~/work/easy-rsa/pki/issued/client.si1230.com
自己署名証明書の配置
自己署名証明書を任意のディレクトリに配置します。これは設定ではなく管理の仕方によるものです。例えばシステム全体で共通の自己署名証明書を使用するのであれば、ルート証明書、ワイルドカード証明書を全てのサーバーの取り決めたディレクトリに配置しておくと証明書の指定が必要なアプリケーションの設定を共通化することができ、管理が楽になります。
以下は、私が普段使用している自己署名証明書の管理方法となりますので、参考にしてみてください。これは Ubuntu のデフォルトの /etc/ssl での管理に基づいていますが、/etc/ssl はデフォルトのルート証明書が多数存在するため、個別のディレクトリを作成して管理しています。
ssl-cert グループを作成します。このグループは Apache などのデフォルトでは自己署名証明書を参照するパッケージをインストールすると自動的に作成されますが、ここでは個別に作成しています。
myadmin@ubuntu:~$ groupadd --gid 900 ssl-cert
ssl-cert グループに管理者を含めます。これはディレクトリ上の操作を楽にするためです。また、特定のユーザーで起動するアプリケーションの場合も、ssl-cert グループに含めることで、適切に参照できるようになります。
myadmin@ubuntu:~$ usermod -a -G ssl-cert myadmin
証明書用ディレクトリを作成します。
myadmin@ubuntu:~$ mkdir /etc/my-ssl
証明書を配置するディレクトリを作成します。
myadmin@ubuntu:~$ mkdir /etc/my-ssl/certs
秘密鍵を配置するディレクトリを作成します。このディレクトリは ssl-cert に含まれるユーザーのみが参照できるようにしています。
myadmin@ubuntu:~$ mkdir -m 0710 /etc/my-ssl/private && chgrp ssl-cert /etc/my-ssl/private
証明書を配置します。
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/issued/si1230.com.crt /etc/my-ssl/certs
証明書の拡張子を cert で指定するアプリケーションが存在するため、コピーして作成しておきます。中身は PEM 形式であれば問題ないようです。
myadmin@ubuntu:~$ sudo cp /etc/my-ssl/certs/si1230.com.crt /etc/my-ssl/certs/si1230.com.cert
秘密鍵を配置します。グループを ssl-cert に変更し、パーミッションを 640 に変更します。
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/private/si1230.com.key /etc/my-ssl/private
myadmin@ubuntu:~$ sudo chgrp ssl-cert /etc/my-ssl/private/si1230.com.key
myadmin@ubuntu:~$ sudo chmod 640 /etc/my-ssl/private/si1230.com.key
.pem の証明書を配置します。この形式は、秘密鍵、証明書の順で単一のファイルに結合したものです。秘密鍵が含まれるため、グループを ssl-cert に変更し、パーミッションを 640 に変更します。
myadmin@ubuntu:~$ sudo cat /home/myadmin/work/easy-rsa/pki/{private/si1230.com.key,issued/si1230.com.crt} | sudo tee /etc/my-ssl/private/si1230.com.pem
myadmin@ubuntu:~$ sudo chgrp ssl-cert /etc/my-ssl/private/si1230.com.pem
myadmin@ubuntu:~$ sudo chmod 640 /etc/my-ssl/private/si1230.com.pem