CentOS7のapacheでSSL評価A+にする設定手順

CentOS7のapacheのSSLの設定をSSL LabsでA+評価にする設定手順をまとめています。
例は以下の環境を前提にしております。

  • サーバ:さくらVPS
  • OS:CentOS7
  • Webサーバ:Apache2.4(Apache HTTP Server)
  • SSL証明書:RapidSSL
  • その他:さくらインターネットでVPSの契約&RapidSSL購入

centos7_apache_ssl_labs_a_plus_result_top

目次

0. なぜ、SSL A+評価が必要か

勉強不足でここ1年くらい前まではブログサイトのようなWebページにはSSLは必要ない、お問合せフォームなど個人情報や機密情報を送信するページのみSSLで暗号化すればよいと考えていました。SSLをWebサーバに設定すれば問題ないと考えていました。そう考えている人も多いのではないかと思います。

しかし、そもそもHTTPに使われるTCP/IPプロトコルには、発信元アドレス偽装やパケットの暗号化機能が標準実装されていないなど共通の脆弱性があります。TCP/IPを使用する場合はデフォルトでこれらの対策が必要です。つまりHTTPでWebページを表示するには、①パケットの改ざんと②パケット盗聴をデフォルトで考慮する必要があります。SSLは認証と暗号化により、①②の対策を行うものです。1年くらい前の自分は①のパケットの改ざんについての理解が不足していました。

加えて、SSL Labsのツールをかけるとわかりますが、Webサーバーデフォルトの設定では評価がCになります。暗号化はされていますが、強度が弱いということになります。昔ならそれでもよかったのでしょうが、新しい攻撃手法は増えてきますし、マシンのスペックが飛躍的に進歩した現状ではそうもいってられないです。A+評価にした上で最新の脆弱性情報に目を光らせる必要があります。

上述でなぜ、SSL A+評価が必要かの理由は述べていますが、もう1つあります。それは、URLを打ち込むだけで簡単に設定の不備とその理由である脆弱性を示してくれることです。これに従えば、SSLについて深い知識がなくてもちゃんとSSLの設定が行えてしまいます。

以下では、CentOS7のapacheでSSL評価A+にする設定手順の例ですが、重要なのはSSL Labsのようなチェックツールにかけて、SSL A+評価のように万全な設定にしておくことと思います。多くのサイトがSSL A+評価になればいいなと思います。

1. CSRと3つのSSL関連ファイル作成

Apacheの設定に入る前にRapidSSL申込み時に使用するCSRと秘密鍵、中間証明書、サーバ証明書を
「/etc/pki/tls/certs/」ディレクトリに用意していきます。

秘密鍵作成

秘密鍵を作成します。

# mkdir /etc/pki/tls/certs/
# cd /etc/pki/tls/certs/
# openssl genrsa 2048 > <ドメイン名>.key
Generating RSA private key, 2048 bit long modulus
..........+++
....+++
e is 65537 (0x10001)

CSR作成

あとでRapidSSLの申込みページで入力するCSRを作成します。
以下のコマンドで証明書の情報を設定します。
ドメイン名と国くらいしか証明書に表示されないので、それ以外はエンターを入力して、デフォルトのままで特に問題ないです。

# openssl req -new -key <ドメイン名>.key -out <ドメイン名>.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:Default City
Organization Name (eg, company) [Default Company Ltd]:Default Company Ltd
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:<ドメイン名>
Email Address []:<メールユーザ>@<ドメイン名>

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []

サーバ証明書申込み

証明書の発行申請

https://ssl.sakura.ad.jp/より、RapidSSLを申込みます。
CSRの入力の際は「<ドメイン名>.csr」の内容をそのまま入力します。※

※「—–BEGIN CERTIFICATE REQUEST—–」及び「—–END CERTIFICATE REQUEST—–」 も含めて入力します。

なお、以下に構築担当者が行うCSRの作成と、決済者もしくはお客様が行うSSLの証明書の発行手順をまとめました。

決済者もしくはお客様にリンクを示して依頼するときに使用していただければと思います。

CSR作成&申込み時の補足&さくらのSSL証明書発行の例

ファイル認証とサーバ証明書の配置

申込みが終わったらさくらインターネットの会員画面で認証ファイルをダウンロードして、
ホームページの公開領域(/直下)に配置して認証を行います。

認証を行ったらserver.crtがダウンロードできるようになります。

server.crtをダウンロードしたら、「<ドメイン名>.crt」にリネームして、
/etc/pki/tls/certs/下に配置します。

中間証明書の作成

さくらインターネットから送られてくるメールに記載されたRapidSSLの中間証明書のリンク(https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate_sha2.html#b)より、中間証明書のコードをコピーして、「ca-rapidssl.crt」というファイル名で保存し、/etc/pki/tls/certs/下に配置します。

2. mod_sslインストール

ApacheでSSLを利用するため、yumでmod_sslをインストールします。

# yum install mod_ssl

3. Apacheの設定ファイル編集

3つのSSL関連ファイルが整いましたので、Apacheの設定を行っていきます。
Apacheの設定ファイルはhttpd.confまたはhttpd.confがインクルードしているファイルに設定を記述します。

mod sslモジュールを有効にする

mod_sslモジュールを有効にします。

LoadModule ssl_module modules/mod_ssl.so	

ssl全般の設定追加

ssl全般的な設定は以下のような感じです。

Listen 443	
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog	
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)	
SSLSessionCacheTimeout  300	
SSLRandomSeed startup file:/dev/urandom  256	
SSLRandomSeed connect builtin	
SSLCryptoDevice builtin	
SSLCompression off

バーチャルホストの設定追加

バーチャルホストに個別のSSL設定を追加します。
SSL3.0までは致命的な脆弱性が報告されていますので、「SSLProtocol all -SSLv2 -SSLv3」のようにして、TLS1.0、TLS1.1、TLS1.2のみ許可するようにします。
SSLCipherSuiteもミソです。設定例は以下のような感じです。
あと「Strict-Transport-Security」を指定して必ずhttpsでアクセスされるようにします。

< VirtualHost *:443>

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder On
SSLCertificateFile /etc/pki/tls/certs/<ドメイン名>.crt
SSLCertificateChainFile /etc/pki/tls/certs/ca-rapidssl.crt
SSLCertificateKeyFile /etc/pki/tls/private/<ドメイン名>.key

Header add Strict-Transport-Security “max-age=15768000”

</VirtualHost>

4. Apacheの再起動

上記の設定を追加するだけでOKです。後はApacheのサービスを再起動するだけです。

CentOS6までと違い、CentOS7では、「systemctl」を使います。

# systemctl restart  httpd.service

5. SSL Labsにアクセスしてテスト

以下のSSL Labsのサイトにアクセスします。

https://www.ssllabs.com/ssltest/index.html

検索エンジンより、「SSL Labs」という検索ワードで検索してSSL Labsのページを表示し、
フォームに構築したホームページのURLを入力します。

A+と表示されます。

centos7_apache_ssl_labs_a_plus_result_bottom

6. SSL評価A+にならなかった場合の解決方法

上述の手順でSSL評価がA+にならなかった場合の解決方法を以下に記載していきます。

6.1. This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure.

SSL Labsで「This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure. Grade set to F.」と表示されて、A+評価にならなかった場合の解決方法です。

This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure.

理由

使用しているOpenSSLのバージョンにOpenSSLの複数の脆弱性(CVE-2016-2107)が存在するためです。

CVE-2016-2107(AES-NI CBC MACチェックでパディングオラクル攻撃が可能な脆弱性)

OpenSSLの1.0.1t、1.0.2hより前のバージョンでAES-NI CBC MACチェックでパディングオラクル攻撃が可能という脆弱性です。この脆弱性は、CVE-2013-0169(Lucky 13パディング)の修正の不具合から生じているとのことです。

参考)http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2107

解決方法

CentOS7もしくはOpenSSLのアップデートを行ってOpenSSLをバージョンアップします。

yumでアップデート
# yum -y update

再テスト

F評価でしたが、再テストしてA+評価になりました。

OpenSSLのアップデート後

更新履歴

  • 2016年07月15日 なぜ、SSL A+評価が必要かについて追記しました。
  • 2016年07月13日 CVE-2016-2107(AES-NI CBC MACチェックでパディングオラクル攻撃が可能な脆弱性)について追記しました。
  • 2016年06月21日 SSL Labsで「This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure. Grade set to F.」と表示されて、A+評価にならなかった場合の解決方法について追記しました。
  • 2016年06月09日 CSR作成&申込み時の補足&さくらのSSL証明書発行の例を追記しました。
  • 2016年06月07日 手順や設定の説明が不足しておりましたので補足を追加いたしました。
  • 2016年06月06日 新規作成しました。

SNSでもご購読できます。