Server

15. HTTPS通信の設定

 この章では、Oracle Linux 8で、ApacheのHTTPS通信対応の設定について記述します。

 参考書では、ceartbot-autoを使ったLet’s Encryptの無料証明書を使ったHTTPS通信(暗号化通信)の設定方法が書かれていますが、私の場合、問題が発生しました。それは、ブラウザで開くと、以下のような警告メッセージが表示されるものです。

HTTPS通信の警告

 これは、私の手順が悪かったのだろうと思いますが、この方法で取得した電子証明書が、自己署名証明書と呼ばれる形式であるために出る警告です。

 電子証明書というのは、本来は厳格なものです。本人確認をキチンと行い、書類を提出するなどの手間がかかります。

 自己署名証明書の場合は、発行者が自分自身になっているため、どこの認証局からも認証されていない証明書として扱われるため、不審な証明書として処理されて、上記のような警告が表示されます。この状態でも、”詳細設定”ボタンを押して警告を無視すれば閲覧できるのですが、一般公開するWebサーバーでこれはまずいでしょう。

 このように思わぬ問題が発生することもありえますので、やはり、お金を払って正式な電子証明書を取得するのがおすすめです。

 幸い昨今では、個人用の格安の電子証明書も販売されています。年間1500円程度で購入できるサイトはいくつかあるのですが、私はKingSSLというところで購入しました。かなり安く購入できるのに丁寧にサポートしていただいたので、私はこれからも継続して利用するつもりです。このお値段でサポートの安心がついてくるのであれば、かなりお得です。


 以下に、KingSSLで電子証明書を購入した場合の注意点を簡単に書いておきます。


 以下に設定手順を説明します。まず、購入した電子証明書を、以下のようなファイル名にして保存し、www.example.netフォルダに保存します。なお、このファイル名は、無料の電子証明書をテスト用に提供してくれたLet’s Encryptに敬意を表し、そのファイル名に準拠しています。

種類 ファイル名
秘密鍵 privkey.pem
サーバー証明書 cert.pem
中間証明書 chain.pem
サーバー証明書+中間証明書 fullchain.pem

 上記のファイルの入ったwww.example.netフォルダを、oluserのホームディレクトリに、WinSCPやRLoginを利用して転送します。以下、ホームディレクトリで作業します。


 電子証明書を置くためのディレクトリを作成します。

sudo mkdir /etc/httpd/conf/keys

 作ったディレクトリのパーミッション(許可属性)を変更します。

sudo chmod 700 /etc/httpd/conf/keys

 転送してきた電子証明書のディレクトリをコピーします。

sudo cp -r www.example.net/ /etc/httpd/conf/keys/

 コピーしたディレクトリのパーミッションを調整します。

sudo chmod 700 /etc/httpd/conf/keys/www.example.net
sudo chmod 400 /etc/httpd/conf/keys/www.example.net/*

 続いて、セキュリティコンテキストを調整します。なお、セキュリティコンテキストの詳細は、参考書を見てください。

sudo chcon -R --reference=/etc/httpd/conf /etc/httpd/conf/keys

 なお、-Rオプションを付けると、右で指定したディレクトリ以下の全てのファイルのセキュリティコンテキストを変更します。--referenceオプションは、=の右のファイルやディレクトリのものと同一のセキュリティコンテキストを設定するためのものです。


 mod_sslをインストールします。

sudo dnf -y install mod_ssl

 /etc/httpd/conf.d/ssl.confを編集します。

sudo vim /etc/httpd/conf.d/ssl.conf

 85行目あたりを以下のように変更します。

 変更前

SSLCertificateFile /etc/pki/tls/certs/localhost.crt

 変更後

#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/httpd/conf/keys/www.kumahachi.xyz/cert.pem

 93行目あたりを以下のように変更します。

 変更前

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

 変更後

#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/httpd/conf/keys/www.kumahachi.xyz/privkey.pem

 102行目あたりを以下のように変更します。

 変更前

#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

 変更後

#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
SSLCertificateChainFile /etc/httpd/conf/keys/www.kumahachi.xyz/chain.pem

 最終行に以下を追記します。

<VirtualHost *:443>
	SSLEngine on
	SSLProtocol -All +TLSv1.2 +TLSv1.3
	SSLCipherSuite AES128+ECDHE:AES256+ECDHE:AES128+EDH:AES256+EDH:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4!CAMELLIA!AES128-SHA!AES128-SHA256!AES128-GCM-SHA256:!AES256-GCM-SHA384:!AES256-SHA256:!AES256-SHA!AES256-CCM8!AES256-CCM!AES128-CCM!ARIA128-GCM-SHA256!AES128-CCM8!ARIA256-GCM-SHA384
	SSLHonorCipherOrder on

	SSLCertificateKeyFile   /etc/httpd/conf/keys/www.example.net/privkey.pem
	SSLCertificateFile      /etc/httpd/conf/keys/www.example.net/cert.pem
	SSLCertificateChainFile /etc/httpd/conf/keys/www.example.net/chain.pem
</VirtualHost>

 SSLProtocolの部分の設定は、TLSという規格の暗号化通信のバージョン1.2と1.3のみを許可するようにしています。SSLCipherSuiteの部分の設定は、弱すぎる暗号化強度のものを排除する設定です。この二つの部分は、古いブラウザにどうしても対応しなければならないのでなければ、このまま設定することをお勧めします。

 なお、この部分の設定は、このサイトを参考にさせていただきました。管理人様には、最大級の感謝をささげます。

 SSLCertificateKeyFileに秘密鍵のファイルをフルパスで指定し、後はそれぞれ、SSLCertificateFileがサーバー証明書、SSLCertificateChainFileが中間証明書となります。


 /etc/httpd/conf.d/myvhost.confを新規作成します。

sudo vim /etc/httpd/conf.d/myvhost.conf

 以下のように書き込んでください。

<VirtualHost *:80>
	ServerName www.example.net
	DocumentRoot "/var/www/http"
</VirtualHost>

 この設定は、HTTP通信とHTTPS通信のホームディレクトリを分けるものです。この設定をしませんと、特にLet’s Encryptの電子証明書を取得したり失効させたりする場合に問題が発生することがありえますので、キチンと設定してください。

 なお、HTTP通信のホームディレクトリが/var/www/http、HTTPS通信のホームディレクトリが/var/www/htmlとなります。


 HTTP通信用のホームディレクトリを作成します。

sudo mkdir /var/www/http

 作ったホームディレクトリのセキュリティコンテキストを調整します。

sudo chcon --reference=/var/www/html /var/www/http

 前の章などを参考にして、適当なWebページのファイルを/var/www/httpディレクトリに用意してください。


 ファイアーウォールにHTTPS通信を許可するように設定します。

sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

 Apacheを再起動します。

sudo systemctl restart httpd

 最後に、ルーターの設定でHTTPSのポート(TCP:443番)を追加します。この設定は、前の章などを参考にしてください。


 以上で設定作業は終わりです。ブラウザのURLに、http://www.example.netと指定したり、https://www.example.netと指定したりして確認してください。