常時SSL化待ったなし!CentOS 7 と Apacheに Let’s Encryptで信頼性の高いHTTPSを設定する

2018/07/05 Apache, CentOS, Linux, サーバー構築

cent-httpd-ssl-top
2018年7月から代表的なウェブブラウザ、Google Chromeの仕様変更(バージョン68)により、HTTPS化されていないウェブサイトには「保護されていません」と表示されるようになります。そんな常時SSL化待ったなしな状況ですので、HTTPS化が必須になってきました。前回のApacheに関する記事
>「CentOS 7 への Apacheインストール。最短でウェブサーバーを構築してテストページを表示する。」
でウェブサーバーであるApacheの導入までが完了しました。本記事では、ウェブサーバーの通信を暗号化してセキュアな通信を行うための機能であるHTTPSの導入までを紹介します。
HTTPSはウェブの通信で利用されているHTTP通信をSSLという機能を利用して暗号化を行っているものになります。現在、GoogleのchromeだとHTTPSに対応していないウェブサイトには警告が出力される他、SEOにも影響があるようです。
出来ればウェブサーバーの導入時には、HTTPS機能も有効にして、上記のような制限に引っ掛からないように設定したほうが良いので、早い段階での設定をオススメします。

スポンサーリンク

サーバー証明書は今まで、有償のものを利用することが一般的でしたが、最近ではSSL通信の普及を行うLet’s Encryptというプロジェクト(2016年4月スタート)で無料で発行しているものを利用することもできます。
因みにLet’s Encryptはシスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体がスポンサーとして支援していますので、信頼できるものです。
本記事ではLet’s Encryptを利用してのHTTPS設定を行っていきます。

尚、導入する環境は以前の記事
>「CentOS 7 への Apacheインストール。最短でウェブサーバーを構築してテストページを表示する。」
で紹介していますが、基本的な環境は以下の通りです。

  • OSのバージョンはCentOSで最新のバージョン7.4を利用しています。
  • ウェブサーバーとしてApache2.4.6がインストールされています。
  • Apacheは基本的な設定が完了して、テストページが表示されています。
  • サーバーはインターネットへ接続されており、グローバルIPアドレスが一つ、割り当てられています。
  • ファイアウォールとしてfirewalldを設定しています。

この環境を前提にHTTPSの設定を進めていきます。

目次

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

Let’s Encryptを利用するためにはホスト名(FQDN:ホスト名にドメイン名がついたもの、以下ホスト名と記載がある時はFQDN)が正引き(ホスト名からIPアドレスを参照)できる必要があります。本記事では、ホスト名として”www.testdom.com”を利用する前提としています。こちらはAレコードとしてDNSにIPを登録していますので、ホスト名の正引きができる状態になっています。(逆引きは不要です。)
設定を行う前に、ホスト名の正引きができることを確認します。Linux/Windowsの何れでも確認ができますので、ご自分の環境に合わせて行って下さい。※ホスト名の正引き設定は、ご利用のDNSサーバーによって異なるため、本記事では割愛しています。

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

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

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

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

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

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

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

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

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

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

先ず、現状の設定を確認していきます。HTTPS接続は、全てのユーザーに開放するため、インターフェイスに適用されているゾーン、”public”ゾーンの設定を確認します。

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

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

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

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

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

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

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

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

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

HTTPS通信を行うためには、HTTPD(Apache)向けに用意されたSSLモジュールのインストールが必要になります。本章ではSSL通信用モジュールである”mod_ssl”のインストールと確認を行います。

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

パッケージ管理用のコマンド、yumでmod_sslパッケージ名の確認を行います。

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

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

yumコマンドでmod_sslパッケージのインストールを行います。以下のようにinstallオプションを付けてyumコマンドを実行します。

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

3-3.インストール後の確認

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

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

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

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

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

ここまででmod_sslのインストールと確認が完了しましたので、続いてインストールしたmod_sslを有効にするためにhttpdを再起動します。CentOSでは7系からsystemctlコマンドでサービスの起動・停止を行います。httpdは以下のようにsystemctlコマンドを実行することで再起動できます。

エラーが出力されなければ、httpdは正常に再起動しています。
systemctlコマンドにstatusオプションを付けて実行することで、起動したサービスの状態について、詳細な情報を取得することができます。以下が実行例です。

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

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

引き続き、SSL証明書に関する設定を行います。HTTP通信をHTTPSへ変更するためには、サーバー証明書(サーバーの身分証明書だと思って下さい)が必要になります。本章ではLet’s Encryptを利用してサーバー証明書を発行する手順を紹介していきます。

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

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

これはCentOSがデフォルト持っているアプリケーションの保存先リスト(通常、レポジトリと呼ばれます。)にはcertbotパッケージが含まれていないためです。certbotは、epel(エンタープライズ Linux 用の拡張パッケージ)レポジトリに含まれています。
epepレポジトリを利用するために、epelレポジトリをインストールします。

4-1-1.epelレポジトリのインストール

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

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

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

4-1-2.epelレポジトリの確認

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

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

上記の応答結果から、epelレポジトリパッケージがインストールされていることが確認できました。
epelがレポジトリリストに追加されていることを確認します。以下のように実行することで、現在、利用が可能なレポジトリリストを確認できます。

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

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

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

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

今度は上記のようにcertbotに関するパッケージが表示されました。この中でHTTPS通信に必要なパッケージは

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

の二つになります。この二つのパッケージをインストールします。先ずはcertbotからインストールを行います。
以下のコマンドでcertbotパッケージをインストールします。

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

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

スポンサーリンク

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

続いてcertbotのapache用プラグインである”python2-certbot-apache”をインストールします。以下のコマンドでpython2-certbot-apacheパッケージをインストールします。

以下が実行結果になります。

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

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

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

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

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

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

項目4.でサーバー証明書を作成するためのcertbotパッケージがインストールされましたので、これを利用してサーバー証明書を作成する手順を紹介していきます。

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

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

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

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

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

上記のように”Congratulations!”と表示されればサーバー証明書の作成は完了です。サーバー証明書の保存場所は上記にも記載されているように/etc/letsencrypt/live/www.testdom.com/ディレクトリになります。(FQDN名のディレクトリは自動的に作成されます。)

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

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

ファイルを確認します。

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

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

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

6.httpdへのSSL通信用の設定

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

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

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

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

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

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

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

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

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

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

に変更します。

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

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

に変更します。

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

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

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

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

6-3.httpdの再起動

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

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

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

7.HTTPSの動作確認

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

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

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

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

Google Chromeのデベロッパーツール(その他のツール=>デベロッパーツール)を起動して通信に問題がないことを確認します。以下のように表示されていれば、通信はセキュアに行われています。
cent-httpd-ssl-7-2
また[View certificate]をクリックすると、サーバー証明書が確認できます。
[全般]タブから、以下のように発行先と、発行者、有効期間が確認できます。
cent-httpd-ssl-7-2-2-02
[証明のパス]タブから証明書に問題がないことが確認できます。
cent-httpd-ssl-7-2-3-03
これでHTTPS通信が正常に行われていることが確認できました。作成したテスト用のindex.htmlファイルは削除しておきます。

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

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

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

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

以下が実行結果になります。

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

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

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

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

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

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

9.まとめ

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

関連する記事


システムでお困りのお客様

もし、貴社で、

  • サポート切れのサーバやネットワーク機器の入れ替えをしたいが、どうしたらよいかわからない
  • サーバやネットワークの管理を行う社員がいないため困っている
  • 業務に利用している機器のセキュリティが大丈夫か心配
  • 機器の障害で、業務への影響が発生している
  • 社内の要望に対して、どのようなシステムを導入したらよいか解らない

など、サーバーやネットワーク、セキュリティでお悩みの方、新規のシステム導入を検討中の方。
多くのシステム構築を行い、成功させてきた実績をもつ弊社が、その問題を解決します。
お気軽にお問い合わせ頂き、貴社の問題解決にお役立てください。

お問い合わせ・ご相談はこちらから

Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク