手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 easy-rsa 自己署名証明書の作成

目次に戻る

Overview

easy-rsa を使用して自己署名証明書を作成します。easy-rsa は OpenSSL コマンドを整理して簡略化したスクリプトです。OpenSSL コマンドは作業ディレクトリが複数に跨ってコマンドが長くなるケース、手順が多くなるケースがありますが、easy-rsa はそれらを扱いやすくしたスクリプトです。また、OpenSSL コマンドには多くのオプションがありますが、通常運用においては easy-rsa で十分だと思いますし、証明書の確認等は結局 OpenSSL コマンドを使用します。

easy-rsa は、元々は OpenVPN の証明書作成ツールとして良く紹介されていましたが、OpenVPN 以外の用途でも問題ありません。おそらくですが、中間証明書は標準的な使い方では作れないと思っています。

前提条件

  • こちらを参考にネットワーク設定が完了していること。
  • こちらを参考に APT のTUI 抑止設定が完了していること。

インストール

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

目次に戻る

Ubuntu 22.04 easy-rsa 自己署名証明書の作成

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る