CentOS 8 のApache HTTP Server環境にcertbotでLet's Encrypt SSLを利用する方法

centos8-certbot-ssl

CentOS 8にウェブサーバー用ソフトウェア「Apache httpd」「PHP」をインストールする手順を以下の記事で紹介しました。このままでも運用はできますが、最近ではHTTPを暗号化するHTTPSが一般的になっています。

サーバーがHTTPSに対応していないと、ブラウザによっては警告が表示されたり、ページが表示できないという問題が発生します。そこで今回はCentOS 8にインストールしたApache httpdで「SSL」を有効にする設定方法を説明していきます。

参考 CentOS 8にApache httpd とPHPインストールする手順を紹介した記事

Open Source
centos8-httpd-virtualhost-top
CentOS 8のApacheにバーチャルホストを設定してサーバーを有効利用する

CentOS 8に用意されたApache httpdパッケージをインストールしてテストページが見えるところまでを前回の記事で紹介しました。今回は記事内でインストールした「Apache httpd」を利用してバーチャルホストを設定してみたいと ...

Open Source
centos8-php72-install
CentOS 8のApache環境にPHP 7.2をインストールして使えるようにする手順

こんにちは、ITエンジニアの小村(@system_kom)です。 以前の記事でCentOS 8にApache httpdのインストールとバーチャルホスト設定する手順を紹介しました。今回はその続きとして、記事内で構築したApache http ...

1. CentOS 8でのSSLとACMEについて

SSLを行うために必要な「サーバー証明書」は今まで、有償のものを利用することが一般的でしたが、最近ではSSL通信の普及を行うLet's Encryptというプロジェクト(2016年4月スタート)で無料で発行しているものを利用することもできます。

メモ

Let's Encryptはシスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体がスポンサーとして支援していますので、信頼できるものです。

本記事ではLet's Encryptを利用してのHTTPS設定を行っていきます。

ACMEv2とmod_mdの注意点

CentOS 8のApache httpdでは「Let's Encrypt」に実装されている「ACME(Automated Certificate Management Environment 証明書発行自動化のプロトコル)」を利用するためのモジュール「mod_md」(md:Managed Domain)が用意されています。

ACMEについては「v1」と「v2」があります。v1については初期の実装で、新規のドメイン登録が2019年11月から出来なくなりました。そのため今後ACMEを利用する場合には「v2」が必須になります。「mod_md」でもACMEv2は利用できますが、CentOS 8に用意されている「mod_ssl」パッケージが2019年11月現在で、ACMEv2に対応していないため、本記事ではLet's Encrpytクライアントとして、CentOS 7と同様に「certbot」を利用します。

「certbot」を利用したサーバー証明書の取得後に「SSL」を有効にします。サーバー証明書を取得するための設定にやや手間が掛かりますが、そこさえクリアしてしまえば難しい手順はありません。是非、SSLを有効にしてサイトの安全性向上を行ってみて下さい。

2. SSLを有効にする環境

SSLを有効にする環境は、以下の記事で構築した「Apache httpd」ウェブサーバーを利用します。
ウェブサーバーの基本的な環境は以下の通りです。

Apache httpdの環境

  • OSのバージョンはCentOSで最新のバージョン8.0.1905.を利用
  • ウェブサーバーとしてApache httpd 2.4.37がインストール済み
  • アプリケーションサーバーとしてPHP 7.2.11がインストール済み
  • Apache httpdはバーチャルホストの設定が完了して、テストページが表示されている
  • サーバーにはグローバルIPアドレス(111.8.21.167)が割り当て済み
  • ドメインはrem-system.comを利用
  • ファイアウォールとしてfirewalldを設定済み

Let's Encryptでの証明書作成はドメインが正引きできる必要があるためグローバルIPアドレスを利用しています。

この環境を前提にSSLを有効にする設定を進めていきます。

3. ホスト名の正引き確認

「Let's Encrypt」に実装されたACMEを利用するためにはホスト名(FQDN:ホスト名にドメイン名がついたもの、以下ホスト名と記載がある時はFQDN)が正引き(ホスト名からIPアドレスを参照)できる必要があります。

本記事ではFQDNのホスト名として「srv01.rem-system.com」を利用する前提としています。「srv01.rem-system.com」ドメインはAレコードとしてDNSにIPを登録していますので、ホスト名の正引きができる状態になっています。(逆引きは不要です。)本記事では参考としてAWS(Amazon Web Service)のDNSサービス「Route53」で設定した場合の例を紹介します。

centos8-ssl-certbot

上記のようにAレコード「srv01.rem-system.com」とIPアドレスである「111.8.21.167」を結びつける設定を行います。設定の完了後にホスト名の正引きができることを確認します。

正引きは「Linux」「Windows」OSのどちらでも確認ができますので、ご利用の環境に合わせて行って下さい。

ホスト名の正引き設定は、ご利用のDNSサーバーやドメイン事業者によって異なるため、本記事では割愛しています。

3-1. hostコマンドによる正引きの確認Linux

Linuxでは"host"コマンドによるホスト名の正引きが可能です。使い方はhostコマンドに正引きしたいホスト名を付けて実行します。以下が実行例になります。

hostコマンドのパッケージについて

CentOS 8のアプリケーショングループとして「サーバー」を選択してインストールした場合には"host"コマンドを利用するためのパッケージ「bind-utils」はインストールされています。もしインストールされていない場合には、以下の手順を参考に"dnf install"コマンドで「bind-utils」パッケージをインストールして下さい。

 command
# dnf -y install bind-utils

「bind-utils」パッケージがインストールされると、"host"コマンドが利用できるようになります。以下のように実行します。

 command
$ host srv01.rem-system.com
srv01.rem-system.com has address 111.8.21.167

上記のように指定したホスト名に対して、IPアドレスが表示されれば正引きの確認は完了です。
ホスト名が見つからないという警告が表示された場合には、ご利用のDNS設定を見直して下さい。ここでは正常に確認ができたという前提で先へ進めていきます。

3-2. nslookupコマンドによる正引きの確認Windows

ホスト名の正引きは「Windows」OSの"nslookup"コマンドでも確認が出来ます。利用している環境がWindowsの場合にはコマンドプロンプトを開いて、以下のように"nslookup"コマンドを実行します。

 command
> nslookup srv01.rem-system.com
サーバー: UnKnown
Address: ***.***.***.**  設定しているDNSサーバー
権限のない回答:
名前: srv01.rem-system.com
Address: 111.8.21.167

上記のようにホスト名に対応するIPアドレスの回答があれば、正引きの確認は完了です。

4. ファイアウォールへの接続許可設定

HTTPS通信ではHTTPで利用しているポート(ソケット)「TCP:80」ではなく「TCP:443」を利用します。以前の記事でファイアウォールの「HTTP」についてはオープンしていますが、HTTPS用の接続ポートはオープンしていないため、事前にHTTPS接続ポートの443番をオープンする設定を行います。

Let's Encryptで証明書を取得するためには「TCP:80」がオープンしている必要がありますので、HTTPの許可は変更不要です。

ファイアウォールはCentOSのデフォルトである「firewalld」を利用している前提となります。

4-1. 現状のファイアウォール設定を確認

ファイアウォールの設定をすすめる前に、現状の設定内容を確認します。HTTPSへの接続は、基本的に全て許可するため、インターフェイスに適用されているゾーンである「public」ゾーンの設定を確認します。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上記のようにHTTPは許可されていますが、HTTPSは許可されていません。

4-2. HTTPSサービスの接続許可を追加

「項目4-1.」で確認した「public」ゾーンの接続許可サービスに「HTTPS」を追加します。追加は以下のように行います。

 command
# firewall-cmd --add-service=https --permanent
success

「success」と表示されれば設定は完了です。設定を反映するためにファイアウォールの設定を読み込みます。

 command
# firewall-cmd --reload
success

「success」と表示されれば設定の読み込みは完了です。

4-3. HTTPSサービスの追加確認

設定した内容が正常に反映されているかを確認します。確認は以下のように行います。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: cockpit dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

「services」の項目に「https」が追加されていれば、確認は完了です。
これでファイアウォールの接続許可は完了しました。

5. バーチャルホスト srv01.rem-system.comの設定

本記事ではSSLを有効にするバーチャルホストとして新規に「srv01.rem-system.com」を追加します。
以前の記事で設定したサイトはドメインが取得されていません。そのためhostsファイルでの名前解決を行っていましたが、Let's Encryptを利用するためにはDNSで名前解決できるドメイン名が必要になります。そのため弊社で取得済みのドメイン「rem-system.com」のサブドメイン「srv01.rem-system.com」を設定して、DNSによる名前解決ができるように設定しました。

DNS側の設定は完了していますが、Apache httpdのバーチャルホスト設定が行われていないため、本章ではバーチャルホストを追加する手順を紹介します。

既存のサイトを変更する場合には本章の作業は不要です。

5-1. バーチャルホスト srv01.rem-system.com用設定ファイル作成

次にバーチャルホスト「srv01.rem-system.com」用の設定ファイルを作成します。作成先は"/etc/httpd/conf.d/"ディレクトリになりますので、エディタの"vi"コマンドを以下のように実行します。ファイル名は「ドメイン名」+ 拡張子「.conf」という命名規則で作成します。

 command
# vi /etc/httpd/conf.d/srv01.rem-system.com.conf

作成するファイルの内容は以下になります。

 code
## VirtualHost03 srv01.rem-system.com
<VirtualHost *:80>
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com.jp-error_log
CustomLog logs/srv01.rem-system.com-access_log combined
</VirtualHost>

設定ファイルに指定されている設定項目とパラメータは以下の内容になります。

<VirtualHost *:80> バーチャルホストの定義
ServerName srv01.rem-system.com バーチャルホスト名を指定
ServerAdmin webmaster@rem-system.com バーチャルホストの管理用メールアドレスを指定
DocumentRoot "/home/www/html/srv01.rem-system.com" バーチャルホストのドキュメントルートを指定。コンテンツが配置されます
<Directory "/home/www/html/srv01.rem-system.com"> ディレクトリのオプションを指定。全てのアクセスを許可しています
ErrorLog エラーログの出力先を指定。ドメイン事に区別すると分かりやすくなります
CustomLog アクセスログの出力先を指定。ドメイン事に区別すると分かりやすくなります

上記のパラメータを運用する環境に合わせて変更します。変更後に設定ファイルを保存します。

5-2. コンテンツ配置用ディレクトリの作成

今回のApache httpdではバーチャルホストを利用することを前提としています。バーチャルホストではアクセス先URLに応じてドキュメントルートとなるディレクトリを分割します。その為、コンテンツを配置するためのディレクトリを事前に作成しておきます。バーチャルホスト毎にディレクトリを作成してコンテンツを配置する形です。

今回設定するバーチャルホストはホスト名が「srv01.rem-system.com」になるため、ディレクトリとして「srv01.rem-site.com」を作成します。ディレクトリを作成する"mkdir"コマンドを以下のように実行します。

 command
# mkdir /home/www/html/srv01.rem-site.com

5-3. テスト用HTMLファイルの作成

作成したバーチャルホスト用のディレクトリにテスト用のHTMLファイルを作成します。

 command
# vi /home/www/html/srv01.rem-system.com/index.html

index.htmlファイルの内容としてバーチャルホストの名前を含んだ以下の記載を行いました。テストページになるため内容は任意で問題ありません。

 code
srv01.rem-system.com test page

記載が終わったらindex.htmlファイルを保存します。これでテストファイルの作成は完了です。

5-4. ディレクトリ所有者の変更

作成したバーチャルホスト用のディレクトリは"mkdir"コマンドを実行したユーザー「root」が所有者になっています。Apache httpdサービスがディレクトリにアクセスできるように所有者をApache httpdウェブサーバー用のユーザーである「www」に変更します

所有者の変更には"chown"コマンド実行します。chownコマンドの"-R"オプションはディレクトリに含まれる全てのファイルとディレクトリの権限を一括で変更します。

 command
# chown -R www:www /home/www/html/srv01.rem-system.com

これでファイルとディレクトリの所有者変更は完了です。

5-5. 設定ファイルの確認と反映

バーチャルホスト用のディレクトリと設定ファイルが作成できましたので「httpd.conf」設定ファイルの内容をチェックする"httpd"コマンドを実行します。"-t"オプションを付けるとチェックが行われます。

 command
# httpd -t
Syntax OK

「Syntax OK」と表示されれば、設定ファイルに間違いはありません。これで設定ファイルの確認は完了です。確認後に変更した設定を反映するためにhttpdを再起動します。"systemctl"コマンドを以下のように実行します。

 command
# systemctl restart httpd

エラーが無ければ、再起動は完了しています。再起動後にhttpdのステータスを"systemctl status"コマンドで確認します。

 command
$ systemctl status httpd
 httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2019-10-15 20:35:20 JST; 5s ago
Docs: man:httpd.service(8)
Main PID: 7275 (httpd)
Status: "Started, listening on: port 80"
Tasks: 213 (limit: 11374)
Memory: 24.4M
CGroup: /system.slice/httpd.service
tq7275 /usr/sbin/httpd -DFOREGROUND
tq7277 /usr/sbin/httpd -DFOREGROUND
tq7278 /usr/sbin/httpd -DFOREGROUND
tq7279 /usr/sbin/httpd -DFOREGROUND
mq7280 /usr/sbin/httpd -DFOREGROUND

正常に起動していることが、コマンドの結果に含まれる「Active: active (running) 」から確認できました。ここまでの手順でSSLを有効にするバーチャルホスト「srv01.rem-system.com」の設定反映が完了しました。

5-6. srv01.rem-system.comの動作確認

設定したバーチャルホスト「srv01.rem-system.com」のURL入力してテスト用のページが表示されることを確認します。

http://srv01.rem-system.com

以下のようにsrv01.rem-system.comサイトのテスト用に作成したHTMLファイルの内容が表示されればバーチャルホストは正常に動作しています。

centos8-certbot-ssl-02

6. SSL通信用モジュールのインストール

SSL化するバーチャルホスト「srv01.rem-system.com」の設定と確認が完了しましたので、本章ではSSL通信用モジュールである「mod_ssl」パッケージのインストールとインストール後の確認を行います。SSLを有効にするためには、Apache httpd用のSSLモジュール「mod_ssl」パッケージのインストールが必要になります。

6-1. mod_sslパッケージの確認

パッケージを検索する"dnf search"コマンドで「mod_ssl」パッケージ名の確認を行います。

 command
$ dnf search mod_ssl
================================ 名前 完全一致: mod_ssl =================================
mod_ssl.x86_64 : SSL/TLS module for the Apache HTTP Server

上記の結果から、SSL通信用モジュールのパッケージ名が「mod_ssl」で間違いないこと確認できました。「mod_ssl」パッケージをインストールする前に、パッケージの詳細な情報を"dnf info"コマンドで確認しておきます。

 command
$ dnf info mod_ssl
利用可能なパッケージ
名前 : mod_ssl
エポック : 1
バージョン : 2.4.37
リリース : 12.module_el8.0.0+185+5908b0db
アーキテクチ : x86_64
サイズ : 130 k
ソース : httpd-2.4.37-12.module_el8.0.0+185+5908b0db.src.rpm
Repo : AppStream
概要 : SSL/TLS module for the Apache HTTP Server
URL : https://httpd.apache.org/
ライセンス : ASL 2.0
説明 : The mod_ssl module provides strong cryptography for the Apache Web
: server via the Secure Sockets Layer (SSL) and Transport Layer
: Security (TLS) protocols.

パッケージのバージョンと説明が確認できました。

6-2. mod_sslパッケージのインストール

mod_sslパッケージのインストールを行います。パッケージのインストールは"dnf install"コマンドを実行します。

 command
# dnf install -y mod_ssl
依存関係が解決しました。
=========================================================================================
パッケージ アーキテクチャー
バージョン リポジトリ サイズ
=========================================================================================
Installing:
mod_ssl x86_64 1:2.4.37-12.module_el8.0.0+185+5908b0db AppStream 130 k
トランザクションの概要
=========================================================================================
インストール 1 パッケージ
ダウンロードサイズの合計: 130 k
インストール済みのサイズ: 268 k
パッケージのダウンロード中です:
mod_ssl-2.4.37-12.module_el8.0.0+185+5908b0db.x86_64.rpm 102 kB/s | 130 kB 00:01
-----------------------------------------------------------------------------------------
合計 62 kB/s | 130 kB 00:02
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
Installing : mod_ssl-1:2.4.37-12.module_el8.0.0+185+5908b0db.x86_64 1/1
scriptletの実行中: mod_ssl-1:2.4.37-12.module_el8.0.0+185+5908b0db.x86_64 1/1
検証 : mod_ssl-1:2.4.37-12.module_el8.0.0+185+5908b0db.x86_64 1/1
インストール済み:
mod_ssl-1:2.4.37-12.module_el8.0.0+185+5908b0db.x86_64
完了しました!

エラーの出力がなく「完了しました!」と表示されれば「mod_ssl」パッケージはシステムにインストールされています。

6-3. mod_sslパッケージ インストール後の確認

システムにインストールされた「mod_ssl」パッケージを確認します。インストールされているパッケージは"dnf list installed"コマンドで確認できます。以下のようにコマンドを実行することで、mod_sslパッケージがインストールされていることを確認できます。

 command
$ dnf list installed | grep mod_ssl
mod_ssl.x86_64 1:2.4.37-12.module_el8.0.0+185+5908b0db @AppStream

出力結果として、mod_sslパッケージが表示されることを確認します。

続いてmod_sslがApache httpdのモジュールとして有効化されていることを確認します。有効化されているモジュールを確認するためには"httpd"コマンドを利用します。"-M"オプションを付けて実行することでモジュールを確認できます。

 command
# httpd -M | grep ssl
ssl_module (shared)

表示された結果に「ssl_module」が含まれれば、mod_sslはApache httpdへモジュールとして登録されています。
これでmod_sslパッケージのインストールと確認は完了です。

"AH00526: Syntax error on line 85 of/etc/httpd/conf.d/ssl.conf:
SSLCertificateFile: file ` /etc/pki/tls/certs/localhost.crt` does not exist or is empty"
というエラーが出力されることがあります。これはCentOS 8のmod_sslパッケージの問題になります。systemdからApacheを起動(もしくは再起動)することで修正されますので、先へ進めてください。

7. Let's Encrypt用クライアント「certbot」のインストール

本章では「Let's Encrypt」を利用するためのクライアント「certbot」をインストールする手順を紹介します。「Let's Encrypt」はCentOS 7まではEPELレポジトリに含まれていましたが、CentOS 8ではEPELレポジトリに含まれていません。
certbotのサイトにはCentOS 8へcertbotインストール手順が紹介されていますので、その手順を参考にインストールを行います。

7-1. certbotのインストール

certbotは公式サイトからダウンロードすることができます。テンポラリディレクトリ"/tmp"に移動して"wget"コマンドでサイトから「certbot-auto」のダウンロードを行います。

 command
# cd /tmp
# wget https://dl.eff.org/certbot-auto
--2019-11-11 18:51:03-- https://dl.eff.org/certbot-auto
dl.eff.org (dl.eff.org) をDNSに問いあわせています... 151.101.108.201, 2a04:4e42:11::201
dl.eff.org (dl.eff.org)|151.101.108.201|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 68699 (67K) [application/octet-stream]
`certbot-auto' に保存中
certbot-auto 100%[=======================>] 67.09K --.-KB/s 時間 0.05s
2019-11-11 18:51:04 (1.31 MB/s) - `certbot-auto' へ保存完了 [68699/68699]

「保存完了」と表示されれば「certbot-auto」のダウンロードは完了しています。ダウンロードしたcertbot-autoを"/usr/local/bin"に移動させてパーミッションを設定します。

 command
# mv certbot-auto /usr/local/bin/certbot-auto
# chown root /usr/local/bin/certbot-auto
# chmod 0755 /usr/local/bin/certbot-auto

設定後のcertbot-autoは以下のようになります。

 command
# ls -al /usr/local/bin/certbot-auto
-rwxr-xr-x 1 root root 68699 11月 11 05:19 /usr/local/bin/certbot-auto

これで「certbot」のインストールは完了です。

8. SSL証明書の作成

本章ではシステムにインストールした「certbot-auto」を利用してSSL通信を行うために必要となるSSLサーバー証明書を作成する手順を紹介していきます。

8-1. certbot-autoコマンドの実行

Let's EncryptによるSSLサーバー証明書は"certbot-auto"コマンドで作成します。Apache httpdに設定したドキュメントルートが「/home/www/html/srv01.rem-system.com」でFQDNのホスト名が「srv01.rem-system.com」の場合、以下のように"certbot-auto"コマンドを実行します。

 command
# /usr/local/bin/certbot-auto certonly --webroot -w /home/www/html/srv01.rem-system.com -d srv01.rem-system.com --email test@rem-system.com --server https://acme-v02.api.letsencrypt.org/directory

コマンドを実行すると、以下のように証明書の作成が始まります。

 log
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/srv01.rem-system.com/privkey.pem
Your cert will expire on 2020-02-09. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

上記のように「Congratulations!...」と表示されればSSL証明書の作成は完了です。SSL証明書の保存場所とファイル名は出力結果にも記載されているように"/etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem"になります。(FQDN名のディレクトリは自動的に作成されます。)

8-2. 作成されたSSL証明書ファイルの確認

"certbot-auto"コマンドで作成されたSSL証明書ファイルを確認してみます。"ls"コマンドで作成されているファイルを確認します。

 command
# ls -a /etc/letsencrypt/live/srv01.rem-system.com
README cert.pem chain.pem fullchain.pem privkey.pem

ファイルが作成されていることが確認できました。各ファイルの役割は以下の通りです。

cert.pem SSL証明書本体
chain.pem 中間証明書
privkey.pem 秘密鍵ファイル
fullchain.pem SSL証明書と中間証明書のセット

作成された4ファイルのうち、今回の環境で利用するものは「fullchain.pem」「privkey.pem」の2ファイルになります。fullchain.pemはウェブサーバーとしてnginxかApache httpdのバージョンが2.4.8以降でないと利用できません。今回はApache httpdのバージョンが2.4.37になりますので「fullchain.pem」ファイルが利用できます。

9. Apache httpd HTTPSとHTTP/2通信用の設定

本章ではApache httpdをSSL(HTTPS)に対応させるための設定手順について紹介します。ここまでの手順でSSL証明書ファイルの作成まで完了しましたので、ウェブサーバーであるApache httpdへSSLの設定を行います。

9-1. バーチャルホスト用設定ファイルの変更

バーチャルホスト「srv01.rem-system.com」の設定は「/etc/httpd/conf.d」以下に作成した「srv01.rem-system.com.conf」で行います。srv01.rem-system.com.confの編集前に、既存のファイルを別名でバックアップしておきます。以下の手順で元ファイルのコピーを行います

 command
# cp -p /etc/httpd/conf.d/srv01.rem-system.com.conf /etc/httpd/conf.d/srv01.rem-system.com.conf.org

バックアップの完了後、viエディタで設定ファイルを開いてSSL用パラメータの追記を行います。

 command
# vi /etc/httpd/conf.d/srv01.rem-system.com.conf

追記する前の設定ファイルは以下の内容になります。

 code
## VirtualHost03 srv01.rem-system.com
<VirtualHost *:80>
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com.jp-error_log
CustomLog logs/srv01.rem-system.com-access_log combined
</VirtualHost>

この内容にSSL用の設定を追記します。

 code
<VirtualHost *:443>
SSLEngine on
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
SSLCertificateFile /etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/srv01.rem-system.com/privkey.pem
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com-ssl-error_log
CustomLog logs/srv01.rem-system.com-ssl-access_log combined
</VirtualHost>

SSLに関するパラメータは以下になります。このパラメータはSSL向けバーチャルホストディレクティブ内に記載します。

<VirtualHost *:443> SSL用バーチャルホストの定義
SSLEngine on SSLを有効にする
ServerName SSL用バーチャルホストのサーバー名
SSLCertificateFile SSL証明書ファイルへのパスを指定。certbotで作成したfullchain.pemファイルへのパス
SSLCertificateKeyFile SSL証明書キーファイルへのパスを指定。certbotで作成したprivkey.pemファイルへのパス

SSL設定を追記した設定ファイルは以下のようになります。

 code
## VirtualHost03 srv01.rem-system.com
<VirtualHost *:80>
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com.jp-error_log
CustomLog logs/srv01.rem-system.com-access_log combined
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
ServerName srv01.rem-system.com
DocumentRoot "/home/www/html/srv01.rem-system.com"
SSLCertificateFile /etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/srv01.rem-system.com/privkey.pem
<Directory "/home/www/html/srv01.rem-system.com">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/srv01.rem-system.com-ssl-error_log
CustomLog logs/srv01.rem-system.com-ssl-access_log combined
</VirtualHost>

SSLに関する設定の追記が終わったら、ファイルを保存します。これでバーチャルホスト用設定ファイルの修正は完了です。

9-2. 設定ファイルの確認

バーチャルホスト用の設定ファイルについて作成が完了したら、ファイルに間違いや問題がないかを確認します。httpdに"-t"オプションを付けて実行することで設定ファイルの間違いをチェックできます。
Apache httpdの設定変更後には実行することをお勧めします。以下のように実行します。

 command
# httpd -t
Syntax OK

「Syntax OK」と表示されれば作成したファイルには問題ありません。
設定ファイルの確認が完了しましたので、変更した設定を反映するためにhttpdを再起動します。"systemctl"コマンドを以下のように実行します。

 command
# systemctl restart httpd

エラーが無ければ、再起動は完了しています。再起動後にhttpdのステータスを"systemctl status"コマンドで確認します。

 command
$ systemctl status httpd
 httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/httpd.service.d
mqphp-fpm.conf
Active: active (running) since Fri 2019-11-08 19:23:07 JST; 4s ago
Docs: man:httpd.service(8)
Main PID: 9332 (httpd)
Status: "Started, listening on: port 443, port 80"
Tasks: 216 (limit: 11374)
Memory: 27.5M
CGroup: /system.slice/httpd.service
tq9332 /usr/sbin/httpd -DFOREGROUND
tq9334 /usr/sbin/httpd -DFOREGROUND
tq9335 /usr/sbin/httpd -DFOREGROUND
tq9336 /usr/sbin/httpd -DFOREGROUND
mq9337 /usr/sbin/httpd -DFOREGROUND

正常に起動していることが、コマンドの結果に含まれる「Active: active (running) 」から確認できました。ここまでの手順で「Apache httpd」のバーチャルホスト設定と反映が完了しました。

9-3.HTTPSポートの確認

HTTPSは「TCP:443」ポートを利用します。サービスの起動後に443ポートが「LISTEN」していることを確認します。
オープンしているポート(ソケット)を確認するためには"ss"コマンドを利用します。"ss"コマンドをオプションなしで実行すると、全ての待ち受けTCP/UDPポートが表示されます。
表示結果を見やすくするために"-lt"オプションを付けます。

参考 ssコマンドのオプション

-l接続待ち状態のポートだけを表示する-tTCPポートのみを表示する
 command
$ ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 128 *:https *:*
LISTEN 0 80 *:mysql *:*
LISTEN 0 128 *:http *:*

上記のように「TCP:443」ポートがLISTENしていることが確認できました。

10. HTTPSの動作確認

ここまでの手順でSSLの設定が完了しましたので、ここからは実際にブラウザでサイトへ接続して、正常にHTTPSが動作していることを確認していきます。利用しているブラウザは「Google Chrome」になります。

10-1. ブラウザでの接続確認

"https://"にホストのFQDNに付けてを入力します。SSLが有効になっているバーチャルホストのサイト名は「srv01.rem-system.com」になりますので

https://srv01.rem-system.com

と入力します。
ブラウザのURL欄に「保護された通信」と表示されていることが確認できます。これは正常にHTTPS通信が出来ている場合に表示されます。

centos8-certbot-ssl-03

10-2. SSL証明書の確認

Google Chromeのデベロッパーツール(その他のツール=>デベロッパーツール)を起動して通信に問題がないことを確認します。以下のように表示されていれば、通信はセキュアに行われています。

cent-httpd-ssl-7-2

また「View certificate」をクリックすると、SSL証明書が確認できます。
「全般」タブから、以下のように証明書発行先と発行者、有効期間が確認できます。

centos8-certbot-ssl-04

「証明のパス」タブからインストールした証明書に問題がないことが確認できます。

centos8-certbot-ssl-05

これでHTTPS通信が正常に行われていることが確認できました。

11. SSL証明書の更新

動作確認までが完了しました。このままの状態で基本的な設定は完了していますが、SSL証明書は有効期間があります。
通常、SSL証明書は1~3年間ぐらいの有効期限で取得しますが、Let's Encryptの場合、これが90日間と決まっています。90日が経過すると、有効期限が切れてしまい、SSL証明書が無効である警告がブラウザに表示されてしまいます。
これではHTTPSを設定した意味がなくなるため、有効期限を定期的に更新する設定を本章では紹介していきます。

11-1. 証明書の更新確認

certbotでは証明書の更新コマンドが用意されています。具体的には"certbot-auto renew"コマンドにで実行します。更新設定を行う前に更新が実行できるかをテストします。テストは"--dry-run"オプションを付けることで行うことができます。
以下のようにコマンドを実行します。

 command
# /usr/local/bin/certbot-auto renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/srv01.rem-system.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for srv01.rem-system.com
Using the webroot path /home/www/html/srv01.rem-system.com for all unmatched domains.
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/srv01.rem-system.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

実行結果にふくまれる「Congratulations, all renewals succeeded...」から正常に証明書の更新ができることを確認できました。これで更新の確認は完了です。

11-2. 更新コマンドの定期実行設定

更新コマンドによるテストで証明書が更新されることが確認できましたので、定期的に実行するように"crontab"にコマンドを追記します。crontabはrootユーザーで実行します。変更は"crontab"コマンドを以下のように実行します。

 command
# crontab -e

実行するとエディタが起動します。certbot更新用コマンドとして"/usr/local/bin/certbot-auto"を記載します。"--deploy-hook"オプションは、SSL証明書の更新が行われた場合のみ実行するコマンドを指定できます。
証明書の更新時には「httpd」サービスを再起動して、更新された証明書を読み込む必要があるため、httpd再起動用のコマンドを指定します。

 code
00 3 * * * /usr/local/bin/certbot-auto renew -q --deploy-hook "systemctl restart httpd"
00 5 * * * /usr/local/bin/certbot-auto renew -q --deploy-hook "systemctl restart httpd"

上記は毎日3:00と5:00に更新コマンドを実行する場合の記載です。(2回実行するように記載しているのは1回目が失敗した場合のため)もし他の時刻にしたい場合には、上記の3と5を適宜変更します。変更後にはファイルを保存します。
証明書が更新された場合は設定後に、内容を確認します。crontabの確認は以下のように実行します。

 command
# crontab -l

先ほど追加した内容が表示されれば、SSL証明書の自動更新設定は完了です。

12. まとめ

ウェブサイトのSSLは最近ではほぼ、完全に定着しまいた。
SSLが有効になっていないサイトはページが表示されないだけでなく、SEOにも大きな影響があります。完全にHTTPサイトが表示されなくなる日もそれほど遠くないと思いますので、できる限り早めのSSL化をおすすめします。certbotを利用することで無償でのSSL化を行うことができます。

是非、設定してウェブサイトのパフォーマンス向上を行って下さい。弊社ではウェブサイトのSSL化について作業代行も行っておりますのでお気軽にお問い合わせ下さい。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-Apache, CentOS, サーバー構築
-