手当たり次第に書くんだ

飽きっぽいのは本能

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

Ubuntu 22.04 で検証用の TLS、内部向け LDAPS、管理画面、OpenVPN などを扱う場合、自己署名のサーバー証明書を単体で作るより、内部 CA を用意してサーバー証明書を発行する方が運用しやすくなります。

この記事では easy-rsa を使い、内部 CA の作成、SAN 付きサーバー証明書の発行、Ubuntu の信頼ストア登録、確認コマンド、失効リストの考え方を扱います。Ubuntu 22.04 の既存環境を保守するための再確認記事です。

関連する記事
この記事で確認すること
  • 内部 CA を作る前に決める境界
  • easy-rsa による CA 初期化
  • SAN 付きサーバー証明書の発行
  • CA 証明書の配布と信頼ストア登録
  • 証明書の検証と失効リストの扱い
参考
書籍
参考書籍

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

公開鍵暗号、証明書、CA の基本を確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

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

内部 CA を作る前に決めること

内部 CA は便利ですが、CA の秘密鍵を持つホストは強い権限を持ちます。発行した証明書をクライアントが信頼するため、CA 秘密鍵の保管場所、操作できる人、バックアップ方法、失効時の扱いを先に決めます。

  • CA 秘密鍵は通常の Web サーバーや LDAP サーバーに置かない
  • CA 証明書は配布してよいが、CA 秘密鍵は配布しない
  • サーバー証明書には CN だけでなく SAN を入れる
  • DNS 名と IP アドレスをどこまで入れるか決める
  • 検証用 CA と長期運用 CA を混ぜない

ここでは例として ca01.example.local で CA を作り、ldap01.example.local 向けのサーバー証明書を発行します。実際の FQDN と IP アドレスに置き換えてください。

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

Ubuntu 22.04 ではパッケージから easy-rsa を導入できます。作業用ディレクトリは /opt/easy-rsa のように用途が分かる場所へ用意します。

sudo apt update
sudo apt install -y easy-rsa
sudo install -d -m 0750 -o root -g root /opt/easy-rsa
sudo cp -a /usr/share/easy-rsa/* /opt/easy-rsa/
sudo chown -R root:root /opt/easy-rsa

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

easyrsa init-pki で PKI ディレクトリを初期化します。既存の CA を上書きしないよう、初回構築時だけ実行します。

cd /opt/easy-rsa
sudo ./easyrsa init-pki
sudo find pki -maxdepth 2 -type d -print

CA の基本値は vars に書いておくと、発行時の入力を減らせます。組織名は例なので、内部運用に合わせて変更します。

sudo tee /opt/easy-rsa/vars >/dev/null <<'EOF'
set_var EASYRSA_REQ_COUNTRY    "JP"
set_var EASYRSA_REQ_PROVINCE   "Tokyo"
set_var EASYRSA_REQ_CITY       "Tokyo"
set_var EASYRSA_REQ_ORG        "Example Internal"
set_var EASYRSA_REQ_EMAIL      "admin@example.local"
set_var EASYRSA_REQ_OU         "Infrastructure"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha256"
set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    825
EOF

内部 CA を作成する

内部 CA を作成します。nopass を付けると CA 秘密鍵にパスフレーズが付きません。完全自動化はしやすくなりますが、CA 秘密鍵の持ち出しリスクも大きくなります。長期運用の CA ではパスフレーズ付きも検討します。

cd /opt/easy-rsa
sudo ./easyrsa build-ca

作成後、CA 証明書と CA 秘密鍵の場所を確認します。配布するのは pki/ca.crt であり、pki/private/ca.key は配布しません。

sudo ls -l /opt/easy-rsa/pki/ca.crt
sudo ls -l /opt/easy-rsa/pki/private/ca.key
openssl x509 -in /opt/easy-rsa/pki/ca.crt -noout -subject -issuer -dates

SAN 付きサーバー証明書を発行する

現在の TLS クライアントは CN だけでなく SAN を見ます。サーバー証明書には、接続に使う DNS 名や IP アドレスを SAN として入れます。

easy-rsa では EASYRSA_EXTRA_EXTS を使って SAN を指定できます。ここでは ldap01.example.local と IP アドレスを入れます。

cd /opt/easy-rsa
sudo EASYRSA_EXTRA_EXTS="subjectAltName=DNS:ldap01.example.local,DNS:ldap01,IP:192.0.2.10" ./easyrsa build-server-full ldap01 nopass

発行された証明書、秘密鍵、CA 証明書を確認します。サーバーへ配布するのはサーバー証明書、サーバー秘密鍵、CA 証明書です。CA 秘密鍵は配布しません。

sudo ls -l /opt/easy-rsa/pki/issued/ldap01.crt
sudo ls -l /opt/easy-rsa/pki/private/ldap01.key
sudo ls -l /opt/easy-rsa/pki/ca.crt

証明書の内容を確認する

発行した証明書の subject、issuer、有効期限、SAN を確認します。SAN が入っていない証明書は、ブラウザ、curl、LDAP クライアントなどで名前検証に失敗することがあります。

openssl x509 -in /opt/easy-rsa/pki/issued/ldap01.crt -noout -subject -issuer -dates
openssl x509 -in /opt/easy-rsa/pki/issued/ldap01.crt -noout -ext subjectAltName

CA 証明書でサーバー証明書を検証します。ここで OK になれば、証明書チェーンとしては内部 CA で検証できます。

openssl verify -CAfile /opt/easy-rsa/pki/ca.crt /opt/easy-rsa/pki/issued/ldap01.crt

サーバーへ配置する

証明書を使うサーバーには、用途に合わせたディレクトリへ配置します。例では LDAP サーバー向けに /etc/ssl/local を使います。秘密鍵は root と対象サービスだけが読める権限にします。

sudo install -d -m 0750 -o root -g ssl-cert /etc/ssl/local
sudo install -m 0644 /opt/easy-rsa/pki/issued/ldap01.crt /etc/ssl/local/ldap01.crt
sudo install -m 0644 /opt/easy-rsa/pki/ca.crt /etc/ssl/local/internal-ca.crt
sudo install -m 0640 -o root -g ssl-cert /opt/easy-rsa/pki/private/ldap01.key /etc/ssl/local/ldap01.key
sudo ls -l /etc/ssl/local

Apache、nginx、389 Directory Server、OpenLDAP、OpenVPN など、使うサービスごとに参照先の設定は異なります。共通して重要なのは、サーバー証明書と秘密鍵の対応、SAN、CA 証明書の配布です。

CA 証明書を Ubuntu に信頼させる

内部 CA をクライアント側で信頼させるには、CA 証明書を /usr/local/share/ca-certificates/ に配置し、update-ca-certificates を実行します。ファイル名は .crt で終わる必要があります。

sudo install -m 0644 /opt/easy-rsa/pki/ca.crt /usr/local/share/ca-certificates/example-internal-ca.crt
sudo update-ca-certificates
ls -l /etc/ssl/certs | grep example-internal-ca || true

信頼ストアへ登録した後は、curl や LDAP クライアントなど、実際に使うクライアントで名前検証まで確認します。

curl -Iv https://ldap01.example.local/
openssl s_client -connect ldap01.example.local:443 -servername ldap01.example.local -verify_return_error </dev/null

失効リストを作成する

秘密鍵を紛失した、サーバー名を変更した、検証用証明書を廃止した、という場合は証明書を失効させます。失効情報を使うサービスでは CRL の配布先も決めておきます。

cd /opt/easy-rsa
sudo ./easyrsa revoke ldap01
sudo ./easyrsa gen-crl
sudo ls -l /opt/easy-rsa/pki/crl.pem
openssl crl -in /opt/easy-rsa/pki/crl.pem -noout -text

CRL を参照するかどうかはサービスやクライアントによって異なります。内部 CA を長く使う場合は、CA 証明書の配布だけでなく、失効情報の配布方法も運用手順に含めます。

ワイルドカード証明書との使い分け

検証環境ではワイルドカード証明書が便利なことがあります。ただし、1 つの秘密鍵が広い名前空間を代表するため、秘密鍵の流出時の影響が大きくなります。個別サーバーの証明書、ワイルドカード証明書、内部 CA のどれを使うかは用途で分けます。

  • 単一サービスなら個別の SAN 付き証明書にする
  • 多数の検証用サブドメインではワイルドカードも候補にする
  • 長期運用では CA 秘密鍵とサーバー秘密鍵を分けて管理する
  • クライアントが内部 CA を信頼できる配布方法を用意する

まとめ

Ubuntu 22.04 で easy-rsa を使うと、内部 CA と SAN 付きサーバー証明書を比較的少ない手順で作成できます。重要なのは、CA 秘密鍵をサーバー証明書の秘密鍵とは別のものとして扱い、配布してよいファイルと配布してはいけないファイルを分けることです。

内部向け TLS を安定して運用するには、SAN、信頼ストア登録、実クライアントでの検証、失効リストまで確認します。証明書ファイルを置くだけで終わらせず、接続名で検証できる状態まで見ることが大切です。

関連する記事
Ubuntu 22.04 easy-rsa – 内部 CA と SAN 付き証明書を作成する

コメントを残す

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

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

トップへ戻る