手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 easy-rsa – 内部 CA と SAN 付き自己署名証明書を作成する

Ubuntu 22.04 で内部向けの TLS 証明書を作成する場合、easy-rsa を使うと、内部 CA、サーバー証明書、クライアント証明書、CRL を比較的少ない手順で作成できます。OpenVPN で使われる印象が強いツールですが、内部 PKI の学習や検証用途にも使いやすいです。

この記事では、easy-rsa で内部 CA を作成し、SAN 付きのサーバー証明書を発行する手順を整理します。あわせて、クライアントへ配布してよいもの、配布してはいけないもの、作成した CA を Ubuntu 側で信頼させる流れも扱います。

参考書籍
参考書籍

暗号技術入門 第3版 秘密の国のアリス

公開鍵暗号、電子署名、証明書など、TLS や内部 PKI の前提になる暗号技術を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連する記事

easy-rsa は証明書を作る側の手順です。作成した CA を Ubuntu に信頼させる手順、内部 PKI の設計、Apache TLS、LDAPS、OpenVPN での利用と合わせて読むと整理しやすくなります。

easy-rsa で作るもの

証明書まわりで混乱しやすいのは、証明書、秘密鍵、CA、サーバー証明書、クライアント証明書の責務が混ざることです。まず、何を作って何を配るのかを分けます。

ファイル役割扱い
CA 証明書この CA が発行した証明書を信頼するための公開情報クライアントへ配布してよい
CA 秘密鍵サーバー証明書やクライアント証明書に署名する鍵絶対に配布しない
サーバー証明書HTTPS / LDAPS / OpenVPN サーバーが提示する証明書サーバーへ配置する
サーバー秘密鍵サーバー証明書に対応する秘密鍵対象サーバーだけに配置する
クライアント証明書クライアント認証で利用する証明書必要なクライアントへ配布する
CRL失効した証明書を示すリスト必要なサービスへ配布する

内部 CA を作る場合、最も重要なのは CA 秘密鍵の扱いです。CA 証明書は配布してよい公開情報ですが、CA 秘密鍵が漏れると、その CA 名義で内部向けの証明書を自由に発行できてしまいます。

easy-rsa をインストールする

Ubuntu 22.04 では、パッケージから easy-rsa をインストールできます。作業用ディレクトリを作り、そこへ easy-rsa の雛形をコピーします。

sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y easy-rsa

mkdir -p ~/easy-rsa
cp -a /usr/share/easy-rsa/* ~/easy-rsa/
cd ~/easy-rsa

CA 秘密鍵を扱う作業ディレクトリなので、共有ディレクトリや不要に広い権限の場所には置かない方が安全です。検証環境でも、CA 秘密鍵と配布用証明書の置き場所は分けて考えます。

PKI ディレクトリを初期化する

既存の PKI ディレクトリがない状態で初期化します。既存環境で実行すると過去の鍵や証明書を消す可能性があるため、作業対象を確認してから実行します。

cd ~/easy-rsa
./easyrsa init-pki

内部 CA を作成する

内部 CA を作成します。ここでは検証しやすいように CA 名を明示します。対話入力を減らしたい場合は vars で既定値を設定しておくと扱いやすくなります。

cd ~/easy-rsa
./easyrsa --batch --req-cn='Example Internal CA' build-ca

作成後、CA 証明書と CA 秘密鍵は次の場所に作られます。CA 証明書はクライアントへ配布できますが、CA 秘密鍵は発行用の中核なので厳重に管理します。

ls -l pki/ca.crt
ls -l pki/private/ca.key

SAN 付きサーバー証明書を作成する

現在の TLS 証明書では、CN だけでなく SAN が重要です。ブラウザ、curl、LDAP クライアントなどは、接続先名が SAN に含まれているかを確認します。内部サーバーでも SAN を明示して作成します。

cd ~/easy-rsa
export EASYRSA_REQ_CN='ldap.example.local'
export EASYRSA_EXTRA_EXTS='subjectAltName = DNS:ldap.example.local,DNS:ldap,IP:10.1.0.10'
./easyrsa --batch build-server-full ldap.example.local nopass

nopass を付けると、サーバー秘密鍵にパスフレーズを設定しません。サービスの自動起動には便利ですが、秘密鍵ファイルが漏えいした場合の影響は大きくなります。サーバー上の所有者、権限、バックアップ経路を含めて管理します。

作成されたサーバー証明書を確認する

作成された証明書と秘密鍵を確認します。サーバーへ配置するのは、サーバー証明書、サーバー秘密鍵、必要に応じて CA 証明書です。

ls -l pki/issued/ldap.example.local.crt
ls -l pki/private/ldap.example.local.key
openssl x509 -in pki/issued/ldap.example.local.crt -noout -subject -issuer -dates -ext subjectAltName

SAN に接続先の FQDN、短いホスト名、必要な IP アドレスが含まれているか確認します。証明書検証エラーの多くは、CA が信頼されていないか、接続先名が SAN と一致していないことが原因です。

サーバーへ配置する

サーバー証明書と秘密鍵は、利用するサービスに合わせて配置します。ここでは例として、内部向け TLS 証明書を /etc/ssl/local/ に配置します。

sudo install -d -m 0750 -o root -g ssl-cert /etc/ssl/local
sudo install -m 0644 pki/issued/ldap.example.local.crt /etc/ssl/local/ldap.example.local.crt
sudo install -m 0640 -o root -g ssl-cert pki/private/ldap.example.local.key /etc/ssl/local/ldap.example.local.key
sudo install -m 0644 pki/ca.crt /etc/ssl/local/internal-ca.crt

秘密鍵は対象サービスの実行ユーザーが読める必要がありますが、誰でも読める状態にはしません。Apache、Dovecot、OpenLDAP、389 Directory Server など、サービスごとに実行ユーザーやグループが異なるため、配置後に起動権限を確認します。

クライアントへ CA 証明書を配布する

クライアント側で証明書検証を通すには、サーバー証明書そのものではなく、発行元である CA 証明書を信頼させます。Ubuntu クライアントでは update-ca-certificates を使います。

sudo install -m 0644 pki/ca.crt /usr/local/share/ca-certificates/example-internal-ca.crt
sudo update-ca-certificates

この作業により、内部 CA で発行した HTTPS や LDAPS の証明書を OS 側で検証できるようになります。CA 秘密鍵をクライアントへ配る必要はありませんし、配ってはいけません。

HTTPS で確認する

証明書を Web サーバーへ設定した後は、curlopenssl s_client で確認します。

curl -v https://ldap.example.local/

openssl s_client \
  -connect ldap.example.local:443 \
  -servername ldap.example.local \
  -verify_return_error \
  -CAfile /etc/ssl/certs/ca-certificates.crt

検証が通る場合、openssl s_client の出力に Verify return code: 0 (ok) が表示されます。通らない場合は、CA 配置、SAN、証明書チェーン、接続先名を順番に確認します。

LDAPS で確認する

LDAPS 用の証明書として使う場合は、LDAP クライアントから確認します。SSSD や LDAP ユーティリティで ldap_tls_reqcert = demand 相当の検証を通すには、CA 信頼と SAN が重要です。

ldapwhoami -H ldaps://ldap.example.local \
  -D 'cn=ro,ou=service,dc=example,dc=local' \
  -W

証明書失効リストを作成する

証明書を失効させる運用まで考える場合は、CRL も作成します。OpenVPN のようにクライアント証明書を扱う用途では特に重要です。

cd ~/easy-rsa
./easyrsa gen-crl
ls -l pki/crl.pem

CRL は、失効確認を行うサービス側へ配置します。CRL を作るだけでは意味がなく、利用するサービスが CRL を参照するように設定されている必要があります。

ワイルドカード証明書について

内部向けに *.example.local のようなワイルドカード証明書を作ることもできますが、便利さと引き換えに秘密鍵漏えい時の影響範囲が広くなります。ワイルドカード証明書は、共通基盤として使うよりも、対象範囲と秘密鍵の境界を明確にした上で限定的に使う方が安全です。

cd ~/easy-rsa
export EASYRSA_REQ_CN='*.example.local'
export EASYRSA_EXTRA_EXTS='subjectAltName = DNS:*.example.local,DNS:example.local'
./easyrsa --batch build-server-full wildcard.example.local nopass

ワイルドカード証明書を使う場合でも、CA 秘密鍵、ワイルドカード証明書の秘密鍵、個別サーバー証明書の秘密鍵は、同じ重みではありません。どの秘密鍵が漏れたときに何が偽装できるのかを基準に保管場所を決めます。

まとめ

Ubuntu 22.04 で easy-rsa を使うと、内部 CA、SAN 付きサーバー証明書、CRL を比較的簡単に作成できます。ただし、証明書作成の作業そのものよりも、CA 秘密鍵、サーバー秘密鍵、CA 証明書の配布境界を分けることが重要です。

サーバー証明書を作った後は、クライアント側で CA 証明書を update-ca-certificates により信頼させ、HTTPS や LDAPS で検証が通ることを確認します。内部システムであっても、証明書検証を無効化するのではなく、CA と SAN を正しく設計する方が安定します。

Ubuntu 22.04 easy-rsa – 内部 CA と SAN 付き自己署名証明書を作成する

コメントを残す

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

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

トップへ戻る