「TLS暗号設定・暗号スイート」の設定変更について(Apache、Nginx編)
- 2021/4/11
- コラム

1. はじめに
以前の記事で、Windows IIS の「TLS暗号設定・暗号スイート」の設定変更について取り上げました。
今回は、主に Unix系 OS にて用いられている Web Server、「Apache」「Nginx」においての「TLS暗号設定・暗号スイート」の設定変更について取り上げます。
2. 前提条件
「Apache」「Nginx」に関しては、LinuxだけでなくWindowsでも利用可能で、Linuxにおいてもディストリビューションやバージョンの違い等により設定方法が異なる場合があります。
これらをすべて網羅することは難しいため、今回は下記の条件の環境で実施することを前提として説明していきます。
・Debian 10.9
・Apache 2.4.38
・Nginx 1.14.2
・OpenSSL 1.1.1d
Apache は、mod_sslモジュールを利用します。
今回の環境は、ディストリビューションとして Debian を使用しており、RedHat 系とは設定ファイルのあるディレクトリ構成やファイル名が異なりますが、基本的に設定する内容は同じです。
RedHat 系に関しましては、5.参考情報のURLもご参照下さい。
3. 設定方法
3-1. Apache
① Apache HTTP Server の設定ファイルを変更します。
# vi /etc/apache2/mods-available/ssl.conf |
Debian の場合は、/etc/apache2/mods-available/ssl.confを編集します。
RedHat 系の場合は、基本的に httpd.conf を編集します。
【変更箇所】
パラメータ名 | 値 | 説明 |
SSLCipherSuite | “<暗号スイート設定文字列>“ | 暗号スイート設定 |
SSLProtocol | <バージョン設定> | プロトコルバージョン設定 |
SSLHonorCipherOrder | on | 暗号スイート順序サーバー優先設定 |
【設定値】( TLS1.2のみを有効化)
パラメータ名 | 値 |
SSLCipherSuite | “ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AES256:ECDHE+CHA CHA20:DHE+aRSA+CHACHA20:+DHE:ECDHE+AES128:ECDHE+CAMELLIA128:ECDHE+AES:ECDHE+CA MELLIA:+ECDHE+SHA:DHE+aRSA+AES128:DHE+aRSA+CAMELLIA128:DHE+aRSA+AES:DHE+aRSA+CA MELLIA:+DHE+aRSA+SHA” |
SSLProtocol | TLSv1.2 |
SSLHonorCipherOrder | on |
【ssl.conf:変更例】

② 変更内容が正しいか、下記のコマンドでチェックを行います。
# apache2ctl configtest |
【実行例】→ 問題がない場合、「Syntax OK」が表示されます。

Apache の再起動を行います。
# systemctl restart apache2 |
【実行例】→ 問題なく再起動出来た場合は、何もメッセージは出ません。

それでは、変更実施がどのように反映されるかを確認するため、実施前と実施後の暗号化プロトコル・暗号スイートの設定状態を比較しましょう。
設定変更後、Nmapにて表示された暗号化プロトコル・暗号スイートの内容がTLS1.2のみになっていることが確認できます。
【実施前の暗号化プロトコル・暗号スイートの設定状態(Nmapにて表示)】

【Apache 再起動後の暗号化プロトコル・暗号スイートの設定状態(Nmapにて表示)】

3-2. Nginx
① nginx の設定ファイルを変更します。
# vi /etc/nginx/nginx.conf |
Debian の場合は、/etc/nginx/nginx.confを編集します。
RedHat 系の場合も、基本的に nginx.conf を編集します。
【変更箇所】
パラメータ名 | 値 | 説明 |
ssl_ciphers | “<暗号スイート設定文字列>”; | 暗号スイート設定 |
ssl_protocols | <プロトコルバージョン設定>; | プロトコルバージョン設定 |
ssl_prefer_server_ciphers | on; | 暗号スイート順序サーバー優先設定 |
【設定値】( TLS1.2のみを有効化)
パラメータ名 | 値 |
ssl_ciphers | “ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AES256:ECDHE+CHA CHA20:DHE+aRSA+CHACHA20:+DHE:ECDHE+AES128:ECDHE+CAMELLIA128:ECDHE+AES:ECDHE+CA MELLIA:+ECDHE+SHA:DHE+aRSA+AES128:DHE+aRSA+CAMELLIA128:DHE+aRSA+AES:DHE+aRSA+CA MELLIA:+DHE+aRSA+SHA“; |
ssl_protocols | TLSv1.2; |
ssl_prefer_server_ciphers | on; |
【nginx.conf:変更後】

② 変更内容が正しいか、下記のコマンドでチェックを行います。
# nginx -t |
【実行例】→ 問題がない場合、「syntax is ok」が表示されます。

③ Nginxの再起動を行います。
# systemctl restart nginx |
【実行例】→ 問題なく再起動出来た場合は、何もメッセージは出ません。

それでは、こちらも変更実施がどのように反映されるかを確認するため、実施前と実施後の暗号化プロトコル・暗号スイートの設定状態を比較しましょう。
Nginxも設定変更後、Nmapにて表示された暗号化プロトコル・暗号スイートの内容がTLS1.2のみになっていることが確認できます。
【実施前の暗号化プロトコル・暗号スイートの設定状態(Nmapにて表示)】

【Nginx再起動後の暗号化プロトコル・暗号スイートの設定状態(Nmapにて表示)】

4. 終わりに
以上が、「Apache」「Nginx」の暗号化プロトコル・暗号スイートを変更する方法となります。
設定の確認方法としては、以前の公開した「Nmapを使ったWebサイトの利用可能な暗号化プロトコル・暗号スイートのチェックについて 」の記事にて紹介しましたNmapを利用しています。前回の記事も併せてご利用下さい。
◆Nmapを使ったWebサイトの利用可能な暗号化プロトコル・暗号スイートのチェックについて
https://www.as-lab.net/nmap%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fweb%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e5%88%a9%e7%94%a8%e5%8f%af%e8%83%bd%e3%81%aa%e6%9a%97%e5%8f%b7%e5%8c%96%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab/
なお、暗号化プロトコル・暗号スイートの変更は、いきなり本稼働サーバーに実施するのではなく、検証環境で試してから実施することをお勧めします。
5. 参考情報
「Apache」「Nginx」の暗号化プロトコル・暗号スイートの設定に関するサイトのURLです。
【Apache】
◆CHAPTER 1. SETTING UP THE APACHE HTTP WEB SERVER
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-http-server_deploying-different-types-of-servers
※ページ内の「1.6.3. Setting the supported ciphers on an Apache HTTP Server」が対象の内容となります。
◆SSL/TLS Strong Encryption: How-To
http://httpd.apache.org/docs/2.4/ssl/ssl_howto.html
【Nginx】
◆Chapter 2. Setting up and configuring NGINX
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-up-and-configuring-nginx_deploying-different-types-of-servers
※ページ内の「2.3. Adding TLS encryption to an NGINX web server」が、対象の内容となります。
◆NGINX SSL Termination
https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/
