CentOS 7とApacheをインストールした環境にLet's EncryptでHTTPSを設定

centos-apache-ssl-sam

こんにちは、レムシステム株式会社 ITインフラ担当の小村(@system_kom)です。

2018年7月からGoogleのウェブブラウザ「Chrome」の仕様変更により、HTTPS化されていないウェブサイトには「保護されていません」と表示されるようになっています。常時SSL化待ったなしな状況ですので、サイトはHTTPS化が必須になってきました。前回のApacheに関する記事でウェブサーバーであるApache httpdのインストールまでが完了しました。

Open Source
CentOS 7へApacheをインストールして最短でウェブサーバーを構築

以前のCentOS環境構築に関する記事でCentOSのインストールと基本的な設定までが完了しました。折角、作成した環境。利用しない手はありません。本記事では、以前の記事で構築したCentOSの環境を利用してウェブサーバーであるApacheの ...

今回は、構築したウェブサーバーのHTTP通信を暗号化してセキュアな通信を行うための機能である「HTTPS」の導入までを紹介します。

HTTPSはウェブの通信で利用されているHTTP通信をSSLという機能を利用して暗号化を行います。現在、GoogleのブラウザであるchromeだとHTTPSに対応していないウェブサイトには警告が出力される他、信頼されないサイトとしてSEOにも影響があります。上記のような理由から、Apacheのインストール時にはHTTPS機能を有効にすることをオススメします。

HTTPS通信に利用するサーバー証明書は今まで、有償のものを利用することが一般的でしたが、2016年4月スタートしたSSL通信の普及を行う「Let's Encrypt」というプロジェクトで発行している無償の証明書を利用することもできます。本記事では「Let's Encrypt」を利用してのHTTPS設定を行っていきます。

Let's Encryptの信頼性

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

1. HTTPSを設定する環境

HTTPSを設定する環境は、Apache httpdをインストールする手順を紹介した以下の記事で詳しく紹介していますが、ここでもまとめておきます。

Open Source
CentOS 7へApacheをインストールして最短でウェブサーバーを構築

以前のCentOS環境構築に関する記事でCentOSのインストールと基本的な設定までが完了しました。折角、作成した環境。利用しない手はありません。本記事では、以前の記事で構築したCentOSの環境を利用してウェブサーバーであるApacheの ...

基本的なOSとインストールされているApache httpdの環境は以下の通りです。

Apache httpdにHTTPSを設定する環境

  • OSのディストリビューションはCentOSでバージョン 7.6を利用
  • ウェブサービスとしてApache 2.4.6をインストール済み
  • Apacheは基本的な設定が完了して、テストページが表示される
  • サーバーはグローバルIPアドレスが割り当てられている
  • OSにはファイアウォールとしてfirewalldを設定済み

この環境を前提にApache httpdのHTTPS設定を進めていきます。この構築手順について詳細を確認したい場合には、上記の記事を参照して下さい。

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

Let's Encryptを利用するためにはホスト名(FQDN:ホスト名にドメイン名がついたもの、以下ホスト名と記載がある時はFQDN)が正引き(ホスト名からIPアドレスを参照)できる必要があります。本記事では、ホスト名として「www.testdom.com」を利用する前提としています。こちらはAレコードとしてDNSにIPを登録していますので、ホスト名の正引きができる状態になっています。

逆引きの設定はHTTPS化では不要ですが、必要な場合には任意で行って下さい。

設定を行う前に、ホスト名の正引きができることを確認します。Linux/Windows のどちらでも確認ができますので、利用している環境に合わせて行って下さい。

ホスト名の正引き設定はDNSサーバーやレジストラによって異なるため、本記事では割愛しています。

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

Linuxではhostコマンドによるホスト名の確認が可能です。使い方はhostコマンドにホスト名を付けて実行します。
以下が実行例になります。尚、hostコマンドはデフォルトでインストールされていないため、yumコマンドでbind-utilsをインストールします。

 command
# yum -y install bind-utils

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

 command
$ host www.testdom.com
www.testdom.com has address 111.8.21.167

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

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

ホスト名の正引きはWindowsでも確認が出来ます。ウェブサーバーへbind-utilsをインストールしたくない場合などは、ご利用のWindowsから確認してください。Windowsの場合は、コマンドプロンプトを開いて、以下のように実行します。

 command
>nslookup www.testdom.com
サーバー: UnKnown
Address: ***.***.***.**    利用しているDNSサーバー
権限のない回答:
名前: www.testdom.com
Address: 111.8.21.167

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

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

HTTPS通信ではHTTPで利用している接続ポート80番とは異なる接続ポートである443番を利用します。以前の記事ではHTTPS用の接続ポートはオープンしていないため、事前に接続ポートをオープンする設定を行います。尚、ファイアウォールはCentOSのデフォルトであるfirewall-cmdを利用している前提となります。

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

設定を行う前に、現状の設定を確認していきます。HTTPSは全て開放するため、インターフェイスに適用されている「public」ゾーンの設定を確認します。

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

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

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

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

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

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

 command
# firewall-cmd --reload
success

「success」と表示されればファイアウォール設定の読み込みは完了です。

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

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

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

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

4. Apache httpd用SSL通信モジュールのインストール

HTTPS通信を行うためには、Apache httpdにSSLモジュールのインストールが必要になります。本章ではSSL通信用モジュールである「mod_ssl」のインストールと確認を行います。

4-1. SSLモジュールパッケージ名の確認

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

 command
$ yum search mod_ssl
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
================= N/S matched: mod_ssl =====================
mod_ssl.x86_64 : SSL/TLS module for the Apache HTTP ServerName and summary matches only, use "search all" for everything.

上記の結果から、SSL通信用モジュールのパッケージ名が"mod_ssl"あることが確認できました。このパッケージをインストールします。

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

mod_sslパッケージのインストールを行います。以下のように"yum install"コマンドを実行します。

 command
# yum -y install mod_ssl
読み込んだプラグイン:fastestmirror
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mod_ssl.x86_64 1:2.4.6-67.el7.centos.6 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
mod_ssl x86_64 1:2.4.6-67.el7.centos.6 updates 109 k
トランザクションの要約
インストール 1 パッケージ
総ダウンロード容量: 109 k
インストール容量: 224 k
Downloading packages:
mod_ssl-2.4.6-67.el7.centos.6.x86_64.rpm | 109 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : 1:mod_ssl-2.4.6-67.el7.centos.6.x [ ]
【略】
検証中 : 1:mod_ssl-2.4.6-67.el7.centos.6.x86_64 1/1
インストール:
mod_ssl.x86_64 1:2.4.6-67.el7.centos.6
完了しました!

エラーの出力がなく「完了しました!」と表示されれば、mod_sslは正常にインストールされています。

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

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

 command
# yum list installed | grep mod_ssl

mod_sslパッケージが表示されることを確認します。

 log
mod_ssl.x86_64 1:2.4.6-67.el7.centos.6 @updates

続いてmod_sslがApache httpdのモジュールとして登録されていることを確認します。登録されているモジュールを確認するためには"httpd"コマンドを利用します。以下のように実行することでモジュールを確認できます。

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

表示された結果に「ssl_module」が含まれれば、httpdへモジュールとして登録されています。

4-4. Apache httpdサービスの再起動

ここまででmod_sslのインストールと確認が完了しましたので、続いてインストールしたmod_sslを有効にするためにhttpdを再起動します。CentOSでは7系からsystemctlコマンドでサービスの起動・停止を行います。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 月 2018-04-23 17:07:31 JST; 21h ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 21408 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 21716 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 21412 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
tq21412 /usr/sbin/httpd -DFOREGROUND
tq21719 /usr/sbin/httpd -DFOREGROUND
tq21720 /usr/sbin/httpd -DFOREGROUND
tq21721 /usr/sbin/httpd -DFOREGROUND
tq21722 /usr/sbin/httpd -DFOREGROUND
tq21723 /usr/sbin/httpd -DFOREGROUND
mq22049 /usr/sbin/httpd -DFOREGROUND

上記では分かり難いかもしれませんが、丸()の部分が正常な起動状態の場合、緑色で表示されます。また、サービスの状態を示す「Active」の項目に「running」と表示されていることから、httpdが起動していることが確認できます。
ここまでの手順で「mod_ssl」のインストールと確認が完了しました。

5. Let's Encryptを利用したサーバー証明書の取得

前章まででApache httpdへのSSLモジュールインストールまで完了しました。本章ではHTTP通信をHTTPSへ変更するためのサーバー証明書(サーバーの身分証明書だと思って下さい)発行に関する設定を行います。本環境では「Let's Encrypt」を利用してサーバー証明書を発行します。

5-1. certbotパッケージ導入前の設定

Let's Encryptを利用するためのアプリケーションは「certbot」という名前でパッケージ化されています。まずはcertbotパッケージを導入する前の準備を行います。デフォルトの状態ではCentOS7の場合、certbotアプリケーションを探してみても見つかりません。

 command
# yum search certbot
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
警告: 一致するものが見つかりません: certbot
No matches found

これはCentOSがデフォルト持っているアプリケーションの保存先リスト(通常、レポジトリと呼ばれます。)にはcertbotパッケージが含まれていないためです。certbotはEPEL(Extra Packages for Enterprise Linux)レポジトリに含まれています。EPELレポジトリを利用するためには、レポジトリのインストールと有効化が必要になります。

5-1-1. EPELレポジトリのインストール

EPELレポジトリは通常のパッケージと同じく"yum install"コマンドでインストールできます。以下のように実行することでインストールが開始されます。

 command
# yum install epel-release

以下、実行後の応答になります。

 log
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-9 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
epel-release noarch 7-9 extras 14 k
トランザクションの要約
インストール 1 パッケージ
総ダウンロード容量: 14 k
インストール容量: 24 k
Is this ok [y/d/N]: y
Downloading packages:
epel-release-7-9.noarch.rpm | 14 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : epel-release-7-9.noarch [
【略】
インストール:
epel-release.noarch 0:7-9
完了しました!

エラーの出力がなく「完了しました!」と表示されればEPELレポジトリは正常にインストールされています。

5-1-2. EPELレポジトリの確認

EPELレポジトリがインストールされたことを確認します。インストールされているパッケージは"yum list"コマンドで確認できます。以下のようにyumを実行することで、EPELレポジトリがインストールされていることを確認します。

 command
$ yum list installed | grep epel

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

 log
epel-release.noarch 7-9 @extras

応答結果から、EPELレポジトリパッケージがインストールされていることが確認できました。
EPELがレポジトリリストに追加されていることを確認します。レポジトリのリストは"yum repolist"コマンドで確認できます。以下のように実行することで、利用が可能なレポジトリの一覧が表示されます。

 command
$ yum repolist

応答結果にepelが表示されればEPELレポジトリを利用する準備は完了しています。

 log
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.yz.yamagata-u.ac.jp
* epel: ftp.yz.yamagata-u.ac.jp
* extras: ftp.yz.yamagata-u.ac.jp
* updates: ftp.yz.yamagata-u.ac.jp
リポジトリー ID リポジトリー名 状態
!base/7/x86_64 CentOS-7 - Base 9,591
!epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 12,507
!extras/7/x86_64 CentOS-7 - Extras 448
!updates/7/x86_64 CentOS-7 - Updates 2,416
repolist: 24,962

これでEPELレポジトリのインストールは完了です。

5-2. certbotパッケージのインストール

項目5-1. でEPELレポジトリが有効になりましたので、再度「certbot」パッケージを確認します。

 command
$ yum search certbot
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* epel: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
================ N/S matched: certbot ================
python2-certbot.noarch : Python 2 libraries used by certbot
python2-certbot-apache.noarch : The apache plugin for certbot
python2-certbot-dns-cloudflare.noarch : Cloudflare DNS Authenticator plugin for Certbot
python2-certbot-dns-cloudxns.noarch : CloudXNS DNS Authenticator plugin for Certbot
python2-certbot-dns-digitalocean.noarch : DigitalOcean DNS Authenticator plugin for Certbot
python2-certbot-dns-dnsimple.noarch : DNSimple DNS Authenticator plugin for Certbot
python2-certbot-dns-dnsmadeeasy.noarch : DNS Made Easy DNS Authenticator plugin for Certbot
python2-certbot-dns-google.noarch : Google Cloud DNS Authenticator plugin for Certbot
python2-certbot-dns-luadns.noarch : LuaDNS Authenticator plugin for Certbot
python2-certbot-dns-nsone.noarch : NS1 DNS Authenticator plugin for Certbot
python2-certbot-dns-rfc2136.noarch : RFC 2136 DNS Authenticator plugin for Certbot
python2-certbot-dns-route53.noarch : Route53 DNS Authenticator plugin for Certbot
python2-certbot-nginx.noarch : The nginx plugin for certbot
certbot.noarch : A free, automated certificate authority clientName and summary matches only, use "search all" for everything.

今度は上記のようにcertbotに関するパッケージが表示されました。この中でサーバー証明書の発行に必要なパッケージは以下の2つになります。

  • python2-certbot-apache.noarch : The apache plugin for certbot
  • certbot.noarch : A free, automated certificate authority client

この2つのパッケージをインストールします。先ずはcertbotからインストールを行います。
"yum install"コマンドでcertbotパッケージをインストールします。

 command
# yum -y install certbot

実行結果は以下のようになります。

 log
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* epel: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
【略】
インストール:
certbot.noarch 0:0.23.0-1.el7
依存性関連をインストールしました:
audit-libs-python.x86_64 0:2.7.6-3.el7 checkpolicy.x86_64 0:2.5-4.el7
libcgroup.x86_64 0:0.41-13.el7 libsemanage-python.x86_64 0:2.5-8.el7
policycoreutils-python.x86_64 0:2.5-17.1.el7 pyOpenSSL.x86_64 0:0.13.1-3.el7
python-IPy.noarch 0:0.75-6.el7 python-cffi.x86_64 0:1.6.0-5.el7
python-chardet.noarch 0:2.2.1-1.el7_1 python-enum34.noarch 0:1.0.4-1.el7
python-idna.noarch 0:2.4-1.el7 python-ipaddress.noarch 0:1.0.16-2.el7
python-ndg_httpsclient.noarch 0:0.3.2-1.el7 python-ply.noarch 0:3.4-11.el7
python-pycparser.noarch 0:2.14-1.el7 python-requests.noarch 0:2.6.0-1.el7_1
python-six.noarch 0:1.9.0-2.el7 python-urllib3.noarch 0:1.10.2-3.el7
python-zope-component.noarch 1:4.1.0-3.el7 python-zope-event.noarch 0:4.0.3-2.el7
python-zope-interface.x86_64 0:4.0.5-4.el7 python2-acme.noarch 0:0.23.0-1.el7
python2-certbot.noarch 0:0.23.0-1.el7 python2-configargparse.noarch 0:0.11.0
python2-cryptography.x86_64 0:1.7.2-1.el7_4.1 python2-future.noarch 0:0.16.0-6.el7
python2-josepy.noarch 0:1.0.1-1.el7 python2-mock.noarch 0:1.0.1-9.el7
python2-parsedatetime.noarch 0:2.4-5.el7 python2-pyasn1.noarch 0:0.1.9-7.el7
python2-pyrfc3339.noarch 0:1.0-2.el7 python2-requests.noarch 0:2.6.0-0.el7
python2-six.noarch 0:1.9.0-0.el7 pytz.noarch 0:2016.10-2.el7
setools-libs.x86_64 0:3.3.8-1.1.el7
完了しました!

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

5-3. python2-certbot-apacheパッケージのインストール

つづいてcertbotのapache用プラグインである「python2-certbot-apache」をインストールします。"yum install"コマンドでpython2-certbot-apacheパッケージをインストールします。

 command
# yum -y install python2-certbot-apache
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.tsukuba.wide.ad.jp
* epel: ftp.tsukuba.wide.ad.jp
* extras: ftp.tsukuba.wide.ad.jp
* updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ python2-certbot-apache.noarch 0:0.23.0-1.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ python-augeas.noarch 0:0.5.0-2.el7 を インストール
--> 依存性の処理をしています: augeas-libs のパッケージ: python-augeas-0.5.0-2.el7.noarch
--> トランザクションの確認を実行しています。
---> パッケージ augeas-libs.x86_64 0:1.4.0-2.el7_4.2 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
python2-certbot-apache noarch 0.23.0-1.el7 epel 215 k
依存性関連でのインストーします:
augeas-libs x86_64 1.4.0-2.el7_4.2 updates 355 k
python-augeas noarch 0.5.0-2.el7 base 25 k
トランザクションの要約
インストール 1 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 595 k
インストール容量: 2.0 M
Downloading packages:
(1/3): python-augeas-0.5.0-2.el7.noarch.rpm | 25 kB 00:00:00
(2/3): python2-certbot-apache-0.23.0-1.el7.noarch | 215 kB 00:00:00
(3/3): augeas-libs-1.4.0-2.el7_4.2.x86_64.rpm | 355 kB 00:00:00
合計 1.1 MB/s | 595 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : augeas-libs-1.4.0-2.el7_4.2.x86_64 1/3
インストール中 : python-augeas-0.5.0-2.el7.noarch 2/3
インストール中 : python2-certbot-apache-0.23.0-1.el7.noarch 3/3
インストール:
python2-certbot-apache.noarch 0:0.23.0-1.el7
依存性関連をインストールしました:
augeas-libs.x86_64 0:1.4.0-2.el7_4.2 python-augeas.noarch 0:0.5.0-2.el7
完了しました!

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

5-4. certbotインストール後の確認

システムにcertbotパッケージがインストールされたことを確認します。インストールされているパッケージは"yum list"コマンドで確認できます

 command
$ yum list installed | grep certbot
certbot.noarch 0.23.0-1.el7 @epel
python2-certbot.noarch 0.23.0-1.el7 @epel
python2-certbot-apache.noarch 0.23.0-1.el7 @epel

結果として上記のように「certbot」「python2-certbot-apache」が表示されればパッケージはインストールされています。
続いてcertbotがインストールされた場所を確認します。インストールされた場所(パス)を確認するためには"which"コマンドを利用します。以下のように実行することでインストールパスを確認できます。

 command
$ which certbot
/usr/bin/certbot

この結果からcertbotが「/usr/bin」以下にインストールされたことが確認できます。これでcertbotのインストールが正常に終了したことが確認できました。

6. サーバー証明書の作成

項目5. でサーバー証明書を作成するための「certbot」パッケージインストールまで終わりましたので、本章ではcertbotを利用してサーバー証明書を作成する手順を紹介していきます。

6-1. certbotコマンドの実行

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

 command
# certbot certonly --webroot -w /home/www/html/ -d www.testdom.com

もしwwwのホスト部分が無い「testdom.com」でもアクセスを行う場合は、以下のようにtestdom.comも追加します。

 command
# certbot certonly --webroot -w /home/www/html/ -d www.testdom.com -d testdom.com

コマンドを実行すると、以下のように対話型のウィザードが起動します。
幾つかの質問がありますので、回答します。

 log
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): info@testdom.com メールアドレスを入力
Starting new HTTPS connection (1): acme-v01.api.Let'sEncrypt.org----
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
----------------------------------------------------------------
(A)gree/(C)ancel: A 利用規約に了解するかを回答(Aを入力)
----------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to Encrypt the web, protect its users and defend digital rights.
----------------------------------------------------------------
(Y)es/(N)o: N メーリングリストに入るかの選択(任意)

回答が終わると、証明書の作成が始まります。

 log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.testdom.com
Using the webroot path /home/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challengesIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/www.testdom.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/www.testdom.com/privkey.pem
Your cert will expire on 2018-07-22. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- 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!」と表示されればサーバー証明書の作成は完了です。サーバー証明書の保存場所は上記にも記載されているように"/etc/letsencrypt/live/www.testdom.com/"ディレクトリになります。(FQDN名のディレクトリは自動的に作成されます。)

6-2. サーバー証明書ファイルの確認

実際に作成されたサーバー証明書ファイルを確認してみます。作成ディレクトリへ移動します。

 command
$ cd /etc/letsencrypt/live/www.testdom.com

作成されたサーバー証明書ファイルを確認します。

 command
$ ls
README cert.pem chain.pem fullchain.pem privkey.pem

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

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

このファイルのうち、今回の環境で利用するものは「cert.pem」「chain.pem」「privkey.pem」の3ファイルになります。fullchain.pemはウェブサーバーとしてnginx、もしくはApache httpdのバージョンが2.4.8以降でないと利用できません。本環境ではApache httpdのバージョンが2.4.6のため利用しません。これでサーバー証明書の作成は完了です。

7. Apache httpdへのSSL通信用の設定

項目6.でサーバー証明書ファイルの作成まで完了しましたので、ウェブサーバーであるApache httpdへSSLの設定を行います。

7-1. ssl.conf設定ファイルのバックアップ

HTTPS通信に関する設定は”/etc/httpd/conf.d”ディレクトリに含まれる ssl.confに行います。先ずはこのファイルをバックアップします。
ディレクトリに移動して、ファイルを確認します。

 command
# cd /etc/httpd/conf.d
# ls
ssl.conf

以下の手順でコピーを行います。

 command
# cp -p ssl.conf ssl.conf.org

コピーされたファイルが存在することを確認します。

 command
# ls
ssl.conf ssl.conf.org

コピーしたファイルssl.conf.orgがあることが確認できました。

7-2. ssl.conf設定ファイルの編集

ファイルのバックアップが完了しましたので、ssl.confを編集していきます。セキュリティなどを考えると、幾つかの設定変更が必要になりますが、その辺りは別の記事に纏めてありますので、そちらを参照してください。
本記事では、HTTPS通信を行うために必要な最低限の設定のみを行う前提としています。変更点は3点で、それぞれサーバー証明書ファイル、秘密鍵ファイル、中間証明書のパスを変更します。
テキストエディタで、ssl.confを開きます。

 command
# vi ssl.conf

まずはサーバー証明書ファイルを示す、以下の点を変更します。

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

を、certbotで作成したファイルのパス

 code
SSLCertificateFile /etc/letsencrypt/live/www.testdom.com/cert.pem

に変更します。

次に秘密鍵ファイルを示す、以下の点を変更します。

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

を、certbotで作成したファイルのパス

 code
SSLCertificateKeyFile /etc/letsencrypt/live/www.testdom.com/privkey.pem

に変更します。

最後に中間証明書ファイルを示す、以下の点を変更します。

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

を、certbotで作成したファイルのパス

 code
SSLCertificateChainFile /etc/letsencrypt/live/www.testdom.com/chain.pem

に変更します。
上記3点のパラメータを変更後に、ファイルを保存します。変更した設定ファイルに誤りが無いかを"httpd"コマンドで確認します。
確認は以下のように実行します。

 command
# httpd -t
Syntax OK

「Syntax OK」と表示されれば、設定ファイルには問題ありません。
これでssl.confファイルの編集は完了です。

7-3. httpdの再起動

変更した設定を反映するためにhttpdを再起動します。

 command
# systemctl restart httpd

エラーが出力されなければ、httpdは正常に再起動しています。
再起動後にstatusを確認します。

 code
$ 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 月 2018-04-23 17:07:31 JST; 7s ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 21408 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 14135 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 21412 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
tq21412 /usr/sbin/httpd -DFOREGROUND
tq21414 /usr/sbin/httpd -DFOREGROUND
tq21415 /usr/sbin/httpd -DFOREGROUND
tq21416 /usr/sbin/httpd -DFOREGROUND
tq21417 /usr/sbin/httpd -DFOREGROUND
mq21418 /usr/sbin/httpd -DFOREGROUND4月 23 17:07:31 www systemd[1]: Starting The Apache HTTP Server...
4月 23 17:07:31 www systemd[1]: Started The Apache HTTP Server.

出力結果から、httpdは正常に起動していることが確認できます。これで設定は完了です。引き続き、HTTPS通信の動作確認を行います。

8. HTTPS通信の動作確認

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

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

利用しているブラウザにURLを入力します。以前は保護されていないと表示された部分が「保護された通信」に変わっています。この状態は正常にHTTPS通信が出来ている場合に表示されます。

cent-httpd-ssl-7-1

8-2. サーバー証明書の確認

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

cent-httpd-ssl-7-2

またデベロッパーツールの「View certificate」をクリックすると、サーバーにインストールされている証明書が確認できます。
「全般」タブから、以下のように証明書の「発行先」「発行者」「有効期間」が確認できます。

cent-httpd-ssl-7-2-2-02

「証明のパス」タブから証明書に問題がないことが確認できます。

cent-httpd-ssl-7-2-3-03

これでHTTPS通信が正常に行われていることが確認できました。作成したテスト用のindex.htmlファイルは削除しておきます。

9. サーバー証明書の更新

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

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

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

 command
# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log----
Processing /etc/letsencrypt/renewal/www.testdom.com.conf
-----------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for www.testdom.com
Waiting for verification...
Cleaning up challenges-----------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/www.testdom.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/www.testdom.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
-----------------------------------------------------------IMPORTANT NOTES:
- Your account credentials have been saved in your Certbot
configuration directory at /etc/Let'sEncrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.

更新テストで正常に更新できることが確認できると「Congratulations, all renewals succeeded.」と表示されます。これで証明書の更新確認は完了です。

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

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

 command
# crontab -e

実行するとエディタが起動します。以下をcrontabに追記します。
"--deploy-hook"オプションは、サーバー証明書の更新が行われた場合のみ実行するコマンドを指定できます。更新時にはApache httpdを再起動して、更新された証明書を読み込む必要があるためApache httpd再起動用のコマンドを指定します。

 code
00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd"

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

 command
# crontab -l

と実行します。先ほど追加した設定が表示されれば、自動更新の設定は完了です。

10. まとめ

HTTPS接続はウェブサイトの主流になりつつあります。以前のようにHTTPで通信されるサイトは信頼性に乏しいと判断されブラウザに警告まで表示されるようになりました。是非、ここでHTTPSの設定を試していただきサイトを信頼性のあるものへと変更してみて下さい。

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

レムシステム

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

-Apache, CentOS
-