手当たり次第に書くんだ

飽きっぽいのは本能

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

目次に戻る

1. 概要

easy-rsa は、OpenSSL コマンドを扱いやすくした証明書作成用スクリプトです。

OpenSSL は柔軟で強力な反面、コマンド構文が複雑で、作業ディレクトリやオプションが多くなりがちです。easy-rsa はこれらの煩雑さを整理し、CA(認証局)の構築からサーバー・クライアント証明書の発行までを簡潔に行えるように設計されています。

もともとは OpenVPN の証明書発行ツールとして広まりましたが、VPN 用途に限らず、一般的な内部システムや検証環境での証明書管理にも問題なく利用できます。内部的には OpenSSL を呼び出しているため、vars ファイルで指定する設定値(鍵アルゴリズム、有効期限など)は OpenSSL の動作に直接反映されます。

通常の運用では easy-rsa の機能だけで十分ですが、証明書の詳細確認や特殊な構成(例:中間証明書を含む階層的なCA構造)を扱う場合には、OpenSSL コマンドを直接使用する必要があります。標準の easy-rsa スクリプトは中間CAの作成を想定していません。

2. 前提条件

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

3. インストール

easy-rsa をインストールします。

sudo apt -y install easy-rsa

4. 実行ファイルの配置

easy-rsa の実行ファイルを配置します。easy-rsa は通常 /usr/share/easy-rsa にインストールされています。配置先は任意ですが、ここでは例として以下のようにホームディレクトリ配下にコピーします。

以前は、/usr/share/easy-rsa へのシンボリックリンクを作成してバージョンアップに追随する方法を採用していましたが、vars ファイルが正しく読み込まれない問題が発生したため、現在はシンプルにコピーして使用しています。

RSA の場合:

cp -a /usr/share/easy-rsa $HOME/work/easy-rsa/rsa

EdDSA の場合:

cp -a /usr/share/easy-rsa $HOME/work/easy-rsa/eddsa

ディレクトリを分ける理由:

vars ファイルの設定内容(例えば鍵アルゴリズムや証明書パラメータ)は各方式(RSA, EdDSA)で異なるため、同一ディレクトリで共存させると設定の競合や混乱が生じます。そのため、アルゴリズムごとに独立したディレクトリを用意することで、設定・管理の明確化と安全性を確保しています。

5. 設定ファイル

vars は easy-rsa の実行時に読み込まれる変数です。

5.1. デフォルト値

デフォルト値は下記の通りです。

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

デフォルト値には、手動で source されることを防ぐためのガードが含まれています。

Easy-RSA v2 では vars を手動で読み込んでから各コマンドを実行する運用が一般的でしたが、v3 では内部的に自動読み込みされる方式へ変更されました。そのため、ユーザーが旧式の方法で source vars を実行すると、環境変数の衝突や処理の破損を招く可能性があります。

このガードはそれを防ぎ、「vars は手動で読み込むものではない」という v3 の設計方針を強制するための仕組みです。

5.2. 設定値

5.2.1. RSA

vars ファイルでは、証明書作成時の各種パラメータを定義します。ここで設定した値は easy-rsa 実行時のデフォルト値として使用され、繰り返し入力する手間を省けます。

RSA 方式を使用する場合は、以下のように設定を行います。内部 CA や OpenVPN 用の証明書発行では、この内容で問題ありません。

tee $HOME/work/easy-rsa/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_DN org
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 rsa
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_DIGEST sha512
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_CRL_DAYS 3650
set_var EASYRSA_CERT_RENEW 60
set_var EASYRSA_RAND_SN yes
set_var EASYRSA_NS_SUPPORT no
set_var EASYRSA_BATCH 1
EOF
変数名意味推奨値補足
EASYRSA_DNDistinguished Name の形式orgcn_only も指定可能だが、組織単位での識別に org が適する
EASYRSA_REQ_COUNTRY国コードJP証明書サブジェクトに反映される
EASYRSA_REQ_PROVINCE都道府県任意例:Tokyo
EASYRSA_REQ_CITY市区町村任意例:Shibuya
EASYRSA_REQ_ORG組織名si1230.comFQDN でも可
EASYRSA_REQ_EMAIL管理者メールmyadmin@si1230.com連絡先情報
EASYRSA_REQ_OU部署名administrator任意設定
EASYRSA_ALGO鍵アルゴリズムrsaed25519 などと切り替え可
EASYRSA_KEY_SIZERSA 鍵長20482048〜4096 が一般的
EASYRSA_DIGEST署名ハッシュ方式sha512現行環境では推奨
EASYRSA_CA_EXPIRECA 証明書の有効期限(日)3650約 10 年
EASYRSA_CERT_EXPIREサーバー・クライアント証明書の有効期限(日)365約 1 年
EASYRSA_CRL_DAYSCRL(失効リスト)の有効期限(日)3650CRL が失効すると接続不可となるため長めが無難
EASYRSA_CERT_RENEW更新猶予(日)60有効期限切れ前の再発行しきい値
EASYRSA_RAND_SN証明書シリアル番号をランダム化yes連番よりも安全性が高い
EASYRSA_NS_SUPPORTNetscape拡張サポートno廃止済み拡張機能のため無効化
EASYRSA_BATCH対話モードを無効化1自動実行・スクリプト運用に必須

5.2.2. EdDSA

Edwards 曲線(ECC)は、RSA に比べて暗号強度が高く、鍵生成・署名処理が高速という特徴があります。特に OpenVPN などの VPN 用証明書では、処理効率とセキュリティのバランスが良いため有用です。

tee $HOME/work/easy-rsa/eddsa/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_DN org
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 365
set_var EASYRSA_CRL_DAYS 3650
set_var EASYRSA_CERT_RENEW 60
set_var EASYRSA_RAND_SN yes
set_var EASYRSA_NS_SUPPORT no
set_var EASYRSA_BATCH 1
EOF
変数名意味推奨値補足
EASYRSA_ALGO鍵アルゴリズムedECC(Edwards Curve)を使用することを指定
EASYRSA_CURVE曲線名ed25519高速かつ高セキュリティなカーブ。現行 OpenSSL でも標準サポート
EASYRSA_KEY_SIZE不要ECC では鍵サイズを指定しない
EASYRSA_DIGEST不要ed25519 は固定ハッシュ構造を持つため設定不要

6. 作業用ディレクトリに移動

easy-rsa コマンドは、実行ファイルが存在するディレクトリ内で実行する必要があります。これ以降、RSA を前提として記載しますが、EdDSA でも同様となります。

cd $HOME/work/easy-rsa/rsa

7. PKI ディレクトリの初期化

init-pki コマンドで初期化します。実行すると作成済みの証明書が全て削除されますので注意しましょう。

./easyrsa init-pki

8. ルート証明書の作成

ルート証明書を作成します。

./easyrsa --req-cn="si1230.com CA" build-ca

ルート証明書の作成時にパスフレーズの設定が必要です。

Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:

非推奨:

build-ca コマンド実行時に nopass オプションを指定すると、CA の秘密鍵(ca.key)がパスフレーズなしで生成され、以降の証明書署名や失効処理を行う際にもパスワード入力が不要になります。

単体で運用する非共有ホスト環境では、即座に深刻な問題が発生するわけではありませんが、複数の管理者や自動化ジョブなどが同一環境で証明書操作を行える構成では、意図しない証明書の失効や再署名が実行可能になるリスクがあります。

そのため、build-ca コマンドでの nopass オプションの使用は推奨されません。CA 鍵はパスフレーズで保護し、必要に応じて EASYRSA_PASSIN 環境変数を利用して自動化との両立を図ることが望ましいです。

9. 環境変数

CA の秘密鍵を EASYRSA_PASSIN 環境変数に「8. ルート証明書の作成」で指定したパスフレーズを設定することで、証明書管理の手間を省くことができます。

永続化する場合、/etc/profile.d に設定ファイルとして配置します。

export EASYRSA_PASSIN=pass:<passphrase>

EASYRSA_PASSIN は、環境変数である性質上、平文で読むことが可能となるため、特定の管理者のみがアクセス可能なホストである場合にのみ使用します。

10. サーバー証明書の作成

サーバー証明書を作成します。用途別にいくつか例示します。

10.1. 最もシンプルな証明書

以下の場合、vars ファイルの内容に基づき、Common Name: server.si1230.com として証明書が作成されます。

./easyrsa build-server-full server.si1230.com nopass

10.2. 有効期限の調整

--days オプションで有効期限を調整できます。指定しない場合は、vars ファイルの内容に基づきます。

./easyrsa --days=3650 build-server-full server.si1230.com nopass

10.3. SAN の指定(推奨)

SAN(Subject Alternative Name)を利用すると複数のドメイン名や IP アドレスを含めることができます。最近は SAN が優先され、Common Name は非推奨とするアプリケーションも存在するため、事実上、必須と考えて良いでしょう。

./easyrsa --subject-alt-name="DNS:server.si1230.com" build-server-full server.si1230.com nopass

10.4. ワイルドカード証明書

ワイルドカード証明書を使用すると、そのドメイン内で使用している全てのサーバーに同じ証明書を使用することができます。

*.si1230.com で作成する場合、以下の両方で使用できますが、

  • www.si1230.com
  • www1.si1230.com

以下は使用できません。

  • www.aaa.si1230.com
./easyrsa build-server-full *.si1230.com nopass

ワイルドカード証明書の注意事項についてはこちらを参照してください。

11. 証明書失効リストの作成

CRL(Certificate Revocation List:証明書失効リスト)は、認証局(CA)が発行した証明書のうち、有効期限内であっても管理者の判断で無効化された証明書を一覧化したリストです。

これにより、証明書を用いた認証方式において、特定のクライアント証明書を失効させ、以降の接続を拒否することが可能になります。

例えば、OpenVPN サーバーは、TLS クライアント認証を行う際に、この CRL を参照します。接続してきたクライアント証明書が CRL に含まれている場合、その証明書は失効済みとみなされ、接続は拒否されます。

この仕組みにより、メンバーの離職や端末の紛失など、証明書の有効期限とは関係なくアクセス権を即時に取り消すことができます。

11.1. ダミーのクライアント証明書作成と失効

CRL を作成するには、まず、失効された情報が存在する必要があります。このため、初回はダミーのクライアント証明書を作成し、失効させます。

クライアント証明書の作成:

./easyrsa build-client-full dummy nopass

クライアント証明書を失効:

./easyrsa revoke dummy

11.2. 証明書失効リストの作成

証明書失効リストを作成します。

./easyrsa gen-crl

12. Diffie-Hellman グループパラメータ

Diffie–Hellman(DH)グループパラメータは、TLS ハンドシェイク時に共通鍵を安全に生成するための数学的パラメータです。サーバーとクライアントが暗号化通信を行う際、このパラメータを用いて「一時的な共有鍵」を生成し、平文で鍵情報をやり取りすることなく安全な通信を確立します。

例えば、OpenVPN で RSA ベースの証明書を使用する場合にこの DH パラメータが必要となります。

一方、楕円曲線暗号(ECC)を使用している場合は、同等の処理が楕円曲線 Diffie–Hellman(ECDH)として内部的に行われるため、別途ファイルを生成する必要はありません。

./easyrsa gen-dh

13. クライアント証明書

クライアント証明書の作成には build-client-full コマンドを使用しますが、サーバー証明書で使用した build-server-full コマンドと使い方やオプションは同じです。

./easyrsa --subject-alt-name="DNS:client.si1230.com" build-client-full client.si1230.com nopass

14. 自己署名証明書の配置

自己署名証明書をシステム全体で共通して利用できるように整理しておくと、証明書を参照する各種アプリケーション(例: Nginx、OpenVPN、Postfix など)の設定を統一でき、運用が容易になります。

ここでは、筆者が実際に運用している設計例を示します。

14.1. 設計方針

Ubuntu の標準ディレクトリ /etc/ssl には多数のシステム証明書が含まれるため、独立した管理用ディレクトリ /etc/my-ssl を作成し、自己署名証明書および秘密鍵を分離して管理します。

また、アクセス制御には ssl-cert グループを用い、必要なユーザーおよびサービスプロセスのみが秘密鍵を参照できるようにします。

14.2. グループの作成とユーザー追加

sudo groupadd --gid 900 ssl-cert
sudo usermod -a -G ssl-cert myadmin

ssl-cert グループは Ubuntu 標準で使用されており、Apache などのパッケージで自動作成されます。ここでは明示的に作成し、証明書管理ユーザーを追加します。

14.3. ディレクトリ構成の作成

sudo mkdir -p /etc/my-ssl/certs
sudo mkdir -m 0710 /etc/my-ssl/private && sudo chgrp ssl-cert /etc/my-ssl/private
  • /etc/my-ssl/certs: 公開証明書を配置
  • /etc/my-ssl/private: 秘密鍵および PEM ファイルを配置(ssl-cert のみ参照可能)

14.4. 証明書と鍵の配置

sudo cp $HOME/work/easy-rsa/pki/issued/server.si1230.com.crt /etc/my-ssl/certs/
sudo cp $HOME/work/easy-rsa/pki/private/server.si1230.com.key /etc/my-ssl/private/
sudo chgrp ssl-cert /etc/my-ssl/private/si1230.com.key
sudo chmod 640 /etc/my-ssl/private/si1230.com.key

14.5. 運用上の補足(任意)

自己署名 CA を使用する場合、クライアントや他サーバーにルート証明書を配布し、update-ca-certificates で信頼登録する必要があります。

目次に戻る

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

コメントを残す

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

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

トップへ戻る