1. 概要
前ページまで、「あそこを読んで」とか「ここを参照して」ばっかりでしたが、いよいよ、証明書設置の具体例です。
本ページは、下記のサイトを参考にさせていただきました。
「Let’s Encryptと自己認証局でクライアント証明書接続」
「クライアント証明書の発行方法」
2. サーバ証明書
まぁ、ここも重複してしまいますが、一応、サーバ証明書の設置方法についても書いておきます。
「Let's Encrypt」で作成した証明書は。
/usr/local/etc/letsencrypt/live/ドメイン名/
以下に存在するはずです。
/usr/local/etc/apache24/extra/httpd-ssl.conf
内に。
SSLCertificateFile /usr/local/etc/letsencrypt/live/ドメイン名/cert.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/ドメイン名/privkey.pem
SSLCertificateChainFile /usr/local/etc/letsencrypt/live/ドメイン名/chain.pem
と書いておけば、サーバ証明書が有効になっているはずです。
「chain.pem」は、「apache」のバージョンによっては、定義してはいけないらしい・・・が未確認です。
3. クライアント証明書を「VirtualHost」で有効化
サブドメインを定義して、「VirtualHost」内で、クライアント証明書を提示することを必要とするように定義するには。
/usr/local/etc/apache24/Includes/hogehoge.conf
に。
Alias /hogehoge "/ドキュメントパス/"
<VirtualHost *:443>
ServerName ドメイン名:443
DocumentRoot /ドキュメントパス
SSLEngine on
SSLCertificateFile /Let's Encrypt のパス/cert.pem
SSLCertificateKeyFile /Let's Encrypt のパス/privkey.pem
SSLCertificateChainFile /Let's Encrypt のパス/chain.pem
SSLCACertificateFile /自己認証局のパス/demoCA/cacert.pem
SSLCARevocationFile /自己認証局のパス/cert.pem
SSLVerifyClient require
</VirtualHost>
<Directory "/ドキュメントパス/">
Options +ExecCGI +Followsymlinks -Indexes +Includes
AllowOverride All
<RequireAll>
Require all granted
Require not ip 拒否するネットワーク
</RequireAll>
</Directory>
てな感じで記述します。
7~15行が、肝心なので、その他の行はテキトーです。
4. クライアント証明書を「Directory」で有効化
特定のディレクトリ配下に、制限をかける場合。
/usr/local/etc/apache24/extra/httpd-ssl.conf
内に。
SSLCACertificateFile /自己認証局のパス/demoCA/cacert.pem
SSLCARevocationFile /自己認証局のパス/cert.pem
を記述したうえで。
/usr/local/etc/apache24/Includes/fugafuga.conf
に。
Alias /fugafuga/ "/ドキュメントルート/サブディレクトリ/"
<Directory "/ドキュメントルート/サブディレクトリ/">
Options None
AllowOverride Limit
SSLVerifyClient require
<RequireAll>
Require all granted
</RequireAll>
</Directory>
と記述します。
これは、1行目と、7行目が、ミソなわけで、後の行はテキトー。
これで、ブラウザから。
https://ドメイン名/fugafuga
以下にアクセスするには、クライアント証明書が必要になります。
5. Forbidden になるとき
特に、設置方法に誤りはないのに、クライアントでサイトを表示すると。
Forbidden
You don't have permission to access this resource.Reason: Cannot perform Post-Handshake Authentication.
てなエラーが表示されることがあります。
てな感じね。
サーバ側のログを見ると。
[Tue Apr 09 15:25:30.213314 2024] [ssl:error] [pid 13745:tid 34544382720] [client 111.239.158.206:50206] AH10158: cannot perform post-handshake authentication
[Tue Apr 09 15:25:30.213341 2024] [ssl:error] [pid 13745:tid 34544382720] SSL Library Error: error:0A000117:SSL routines::extension not received
てな、ログが出力されております。
なんか、「TLS」のバージョンが合わない(「TLS」が何かわかっておりませんが)とこうなるらしい。
/usr/local/etc/apache24/extra/httpd-ssl.conf
の。
SSLProtocol all -SSLv3
を。
SSLProtocol -All +TLSv1.2
と書き換えることで、解消します。