HTTPSはLet’s Encryptで、クライアント認証は自己認証局(通称 オレオレ認証局)がサインしたクライアント証明書を使って行うことができます。
CentOS 7 の Apache は 2.4.6 なので、そのマニュアルを確認してみます。
サーバー証明書の認証局証明書はSSLCertificateChainFileディレクティブで、クライアント証明書の認証局証明書はSSLCACertificateFileディレクティブで設定します。
ちなみに、クライアント証明書の認証局が複数ユーザーでそれぞれ違う場合では、SSLCACertificatePathディレクティブで指定したディレクトリに、ハッシュ値を名前にしたシンボリックリンクを置くことで複数の認証局の証明書を置くことができる、とあります。
つまり、サーバー証明書の認証局とクライアント認証の認証局はそれぞれ別なものを設定できます。当然、それらが同じものである必要はありません。
オレオレ認証局のデメリット
自己認証局で署名したサーバー証明書を使用すると、ブラウザでサイトにアクセスした際に警告が表示されてしまいます。
この警告を回避するためには、自己認証局の証明書をルート証明書としてクライアントに登録しなければなりません。
自己認証局によるクライアント認証の方法について検索すると、サーバー証明書についても自己認証局で署名した証明書を設置する方法が書かれていますが、無料SSL証明書の登場以前に費用をかけず目的を達成するためにはこうするしかなかったからです。
Let’s Encryptで無料の証明書を入手できるようになったので、この部分については無理して自己認証局の署名によるサーバー証明書を使う必要は無いと思います。
クライアント認証にはルート証明書が不要
クライアント認証だけを考えるなら、クライアントPCへの認証局証明書のインストールは不要です。
一方で、サーバー側には認証局の発行した証明書が必要になります。SSLCACertificateFileディレクティブで指定する証明書のことです。
クライアント証明書を認証機関で発行してもらおうとするとそこそこの費用が発生してしまいます。
そこで自己認証局の認証局証明書をサーバーに設置し、その認証局によってオレオレ認証したクライアント証明書を配布すれば良いでしょう。
設置方法
Let’s Encryptによる無料SSLの取得方法と、自己認証局を建ててクライアント証明書に署名をする方法やルート証明書の発行については、多くのサイトで触れられているので割愛します。
ApacheのConfに設定が必要な部分のみを以下に書いておきます。なお、この例では、Let’s Encryptは –webroot プラグインで取得し、自己認証局は /etc/pki/myCA/ に証明書を置いています。
#---------------------------------------
# http:80 はLet's Encryptの自動更新のためのみに使用する。
#---------------------------------------
<VirtualHost *:80>
#
# 省略
#
<Directory "/var/www/html">
Require all denied
</Directory>
<Directory "/var/www/html/.well-known">
DirectoryIndex index.html
Require all granted
</Directory>
#
# 省略
#
</VirtualHost>
#---------------------------------------
# HTTPS:443
#------------------------------------------
<VirtualHost *:443>
#
# 省略
#
#Letsencrypt Apache 2.4.6の場合は、fullchainを使用できない
SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン名]/chain.pem
#オレオレ認証局
SSLCACertificateFile /etc/pki/myCA/cacert.pem
SSLCARevocationFile /etc/pki/myCA/crl.pem
#クライアント認証によるアクセス制限
SSLVerifyClient require
SSLVerifyDepth 1
#
# 省略
#
</VirtualHost>
この設定の場合、すべてのHTTPS接続についてクライアント認証を求めることになります。
特定のディレクトリやロケーションのみに行う場合は、SSLVerifyClient require をDirectoryやLocationディレクティブ内に移してください。
SSLVerifyDepth は、個人が署名したクライアント証明書(0)にオレオレ認証局が署名(1)した2段なので、1を設定すれば問題ありません。
免責
上記の内容については、私の知見不足により間違った記述などがあるかもしれません。ご指摘がある場合は、是非コメントなどで教えていただけると嬉しいです。
また、この記事を参考にサーバーを運用される場合は、オレオレ認証局の秘密鍵の管理、クライアント証明書の配布方法・管理方法、サーバー設定、オペレーションやリスクを勘案の上、マニュアルなどの公的資料を良く確認した上で自己責任で運用してください。
コメント