ウェブサーバ - クライアント証明書 - 証明書の設置

 クラウディア
1. 概要
2. サーバ証明書
3. クライアント証明書を「VirtualHost」で有効化
4. クライアント証明書を「Directory」で有効化
5. Forbidden になるとき

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.
 てなエラーが表示されることがあります。
「ブラウザ」-「Forbidden」

 てな感じね。
 サーバ側のログを見ると。


[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
 と書き換えることで、解消します。
ハイスピードプランツインバード・ストア