目次
ご説明
Apacheでクライアント証明書認証を設定する方法
今回は、AmazonLinux2023で検証しております。
クライアント証明書認証を使うと、正しい証明書を持つユーザーだけにアクセスを許可できます。
パスワード認証よりも強固なセキュリティを実現できるため、社内システムや管理画面のアクセス制限によく使われます。
この記事では、サーバー証明書にはLet's Encryptを使い、クライアント証明書は独自CA(認証局)で発行する構成を解説します。
よくある疑問:Let's Encryptでクライアント証明書は発行できる?
結論から言うと、Let's Encryptはクライアント証明書の発行に対応していません。
| 役割 | Let's Encrypt | 独自CA(openssl) |
|---|---|---|
| サーバー証明書(HTTPS化) | ✅ 対応 | ✅ 対応 |
| クライアント証明書(認証用) | ❌ 非対応 | ✅ 対応 |
そのため、この記事では以下の組み合わせで構成します。
- サーバー証明書 → Let's Encrypt(無料・自動更新)
- クライアント証明書 → openssl で自前発行
全体の構成イメージ
クライアント(ブラウザ)
↓ クライアント証明書を提示
Apache(サーバー)
↓ CAの証明書で検証
独自CA(openssl で作成)
ブラウザがApacheにアクセスする際、独自CAが発行したクライアント証明書を提示します。Apacheはそれを独自CAの証明書で検証し、正規のユーザーかどうかを確認します。
独自CAの作成
まずはクライアント証明書に署名するための独自CAを作成します。
root権限で実行
$ sudo -i
ディレクトリ作成
# mkdir -p /etc/ssl/myca
# cd /etc/ssl/myca
# chmod 700 /etc/ssl/myca
CA秘密鍵の生成
# openssl genrsa -out ca.key 4096
CA証明書の作成(有効期限:10年)
# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=JP/ST=Tokyo/O=MyOrganization/CN=MyCA"
ca.key(CA秘密鍵)は厳重に管理してください。
これが漏洩するとクライアント証明書を偽造される可能性があります。
chmod 700 でディレクトリごとアクセス制限をかけておくのが確実です。
クライアント証明書の発行
次に、ユーザーに配布するクライアント証明書を作成します。
秘密鍵、CSRを作成
# openssl req -new -newkey rsa:2048 -nodes -keyout client.key -out client.csr -subj "/C=JP/O=MyOrganization/CN=client"
クライアント証明書(有効期限:1年)
# openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
ブラウザにインポートできるようp12形式に変換
# openssl pkcs12 -export -in client.crt -inkey client.key -certfile ca.crt -out client.p12
Enter Export Password:パスワードあり
Verifying - Enter Export Password:パスワードあり
client.p12を利用しているPCにコピーいたします。ブラウザーへのインポート時にパスワードが求められます。
Apacheの設定
/etc/httpd/conf.d/ssl.confに設定ファイルに以下を追記します。
# vi /etc/httpd/conf.d/ssl.conf
独自CAの証明書を指定
SSLCACertificateFile /etc/ssl/myca/ca.crt
クライアント証明書を必須にする
SSLVerifyClient require
SSLVerifyDepth 1
SSLOptions +StdEnvVars
SSLVerifyClientの使い分け
| 設定 | 証明書あり | 証明書なし |
|---|---|---|
| require | ✅ アクセス可 | ❌ ERR_BAD_SSL_CLIENT_AUTH_CERT |
| optional | ✅ アクセス可 | ✅ アクセス可(証明書なしでも通る) |
証明書を持っている人だけに制限したい場合はrequireを使います。
Apacheを再起動して動作確認
設定ファイルの構文チェック
# apachectl configtest
Apacheを再起動
# systemctl restart httpd
ブラウザーへの証明書インポート手順(Windows11)
1. PCのデスクトップに対象サーバーの「client.p12」をSFTPなど利用してダウンロードしてください。
2.「client.p12」をダブルクリックする。
「現在のユーザー」をクリックし「次へ」をクリックする。

3. 「次へ」をクリックする。

4. 「パスワード」を入力し「次へ」をクリックする。パスワードはp12形式に変換ときのものを利用する。

5. 「証明書の種類に基づいて、自動的に証明書ストアを選択する」を選択し「次へ」をクリックする。

6. 「完了」をクリックする。

ブラウザーで確認
https//www.d1j.jp/にアクセスいたします。(設定をしたドメインにアクセスしてください。)
1. 証明書の選択が表示されます。証明書を選んで「OK」をクリックする。

2. AWSのデフォルトのホームページがみれたと思います。

トラブルシューティング
| 症状 | 原因 | 対処法 |
|---|---|---|
| ERR_BAD_SSL_CLIENT_AUTH_CERT | 証明書がブラウザにインポートされていない | p12ファイルを再インポート |
| 証明書選択ダイアログが出ない | SSLVerifyClientにnoneなっている | 設定optionalをまたはrequireに変更 |
まとめ
- サーバー証明書はLet's Encrypt、クライアント証明書は独自CA(openssl) の組み合わせが現実的
- 証明書を持っている人だけ制限するシンプルな構成なら 「SSLVerifyClient require」が最適
- クライアント証明書認証はパスワードレスかつ強固なアクセス制御を実現できる
クライアント証明書の有効期限管理(更新・失効)も重要です。
有効期限が切れると突然アクセスできなくなるため、「openssl x509 -enddate -noout -in client.crt」で定期的に確認するようにしましょう。
