目次

ご説明

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」で定期的に確認するようにしましょう。