TL;DR
前回の記事でApacheのWebサーバーを導入したので、今回はさらにmod_sslを導入する。
その後サーバー証明書を使って、Webサーバーを認証できるように設定していきます。
なぜサーバー証明書が必要か?
中間者攻撃を防ぐため
中間者攻撃
Webサーバーと利用者の間で行われる通信に割り込み、両者になりすますことで通信の盗聴や改ざんを行う攻撃手法。
httpsでの通信を開始するにあたって、クライアントがこれから通信しようとしている相手が意図したサーバーかどうか?を確認できなければ、データ自体は暗号化できていても機密情報が漏洩してしまいます。
これを防ぐためにhttps通信を開始する前に、クライアント側はこれから通信しようとしている相手が自分の意図した相手か?を確認するために必要となるのがサーバー証明書です。

下の図で言うところの、「認証局の公開鍵でサーバー署名と公開鍵を確認」にて、これから通信しようとしている相手が意図した相手か?を検証するという感じです。
サーバー署名はサーバーの秘密鍵で暗号化されているので、これから通信しようとしているサーバーの公開鍵を使って復号できるかどうかで、意図した通信相手かどうかを確認するというわけです。
サーバー認証の流れ

今回は上の図の一連のやりとりをやってくれる、mod_sslというモジュールをApacheに追加して、https通信を行うための設定を実践していきます。
mod_sslのインストール
[root@infrastudy ~]# yum -y install mod_ssl
秘密鍵の作成
[root@infrastudy ~]# openssl genrsa > server.key
以下のような結果になればOK
Generating RSA private key, 2048 bit long modulus (2 primes)
..............+++++
.......+++++
e is 65537 (0x010001)
証明書署名要求
[root@infrastudy ~]# openssl req -new -key server.key > server.csr
Country Nameなど聞かれるので、順に入力する。
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:osaka
Organization Name (eg, company) [Default Company Ltd]:hoge
Organizational Unit Name (eg, section) []:hogehoge
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:hoge@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:hogehoge
An optional company name []:hoge
6行目のCommon Nameにはサーバーのドメイン名を入力する。
署名する
[root@infrastudy ~]# openssl x509 -req -signkey server.key < server.csr > server.crt
うまくいけば、以下のように表示される。
Signature ok
subject=C = JP, ST = Osaka, L = osaka, O = hoge, OU = hogehoge, CN = www.example.com, emailAddress = hoge@gmail.com
Getting Private key
作成した秘密鍵を証明書を任意の場所へ配置する
[root@infrastudy ~]# mkdir /etc/httpd/conf/keys
[root@infrastudy ~]# mkdir /etc/httpd/conf/crt
[root@infrastudy ~]# mv server.key /etc/httpd/conf/keys/
[root@infrastudy ~]# mv server.crt /etc/httpd/conf/crt/
配置した秘密鍵と証明書の場所を設定ファイルに記載する。
mod_sslの設定ファイルは、/etc/httpd/conf.d/ssl.confです。
この設定ファイルに以下のディレクティブを追加します。
# pass phrase. Note that restarting httpd will prompt again. Keep
# in mind that if you have both an RSA and a DSA certificate you
# can configure both in parallel (to also allow the use of DSA
# ciphers, etc.)
# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
# require an ECC certificate which can also be configured in
# parallel.
SSLCertificateFile /etc/httpd/conf/crt/server.crt
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# ECC keys, when in use, can also be configured in parallel
SSLCertificateKeyFile /etc/httpd/conf/keys/server.key
/etc/httpd/conf.d/ssl.confの主なディレクティブ
ディレクティブ | 値の説明 |
SSLEngine | SSL/TLSプロトコルの有効化・無効化を指定。 on,offのいずれかを選択。 |
SSLProtocol | 接続可能なSSL/TLSプロトコルのバージョンを指定。 |
SSLCipherSuite | 使用可能な暗号スイートを指定 |
SSLCertificateFile | サーバー証明書のファイルを指定 |
SSLCertificateKeyFile | SSLサーバー証明書とペアとなるサーバ秘密鍵のファイルを指定。 |
SSLCertificateChainFile | 中間CA証明書のファイルを指定 |
補足1 SSLProtocolの設定
特定のプロトコルを利用可能とする場合は以下のように記載。
SSLProtocol +TLSv1.1 +TLSv1.2
特定のプロトコルを利用不可とする場合は以下のように記載。
SSLProtocol -SSLv2 -SSLv3

「all」を指定するとすべてのバージョンを指定できます。
が、「all」の内容はApacheやOpenSSLのバージョンによって異なります。
暗号スイートの設定
Webサーバーで利用可能な暗号スイートを利用する。
SSLCipherSuite HIGH:!aNULL:!MD5

「!」を指定することで、指定した暗号リストを覗く。
利用可能な暗号スイートを確認するにはopenssl ciphersコマンドを実行する。
[root@infrastudy ~]# openssl ciphers -v
以下のような結果となる。
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
TLS_AES_128_CCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESCCM(128) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
列 | 意味 |
1列目 | 暗号スイート名 |
2列目 | SSL/TLSプロトコルバージョン |
3列目 | 鍵交換に利用されるアルゴリズム |
4列目 | 証明書の署名に利用されるアルゴリズム |
5列目 | 暗号化通信に利用される共通鍵暗号アルゴリズム |
6列目 | 証明書の署名に利用されるハッシュ関数 |
ここまでを設定後、ブラウザからWebサーバーへ接続すると…?

https通信は始まりましたが、自己署名証明書のためブラウザが警告を表示しています。
100%正しく検証するためにはドメインが必要なのですが、私はいまテスト用にドメインを持ち合わせていないので、ここまでの確認となっています。
一応、証明書情報について確認します。

自分で署名しているのであたりまえですね。
今回は以上です。お疲れ様でした。