WebサーバをHTTPS化する|Apache|ConoHa VPS

こんにちは。前回はApacheを使用してWebサーバを構築する手順を紹介しました。しかし、この状態だと「ただ動くようにしただけ」であってセキュリティ面はまだ不十分な状態です。

例えば、下図の左上のアドレスバーに表示される「Not secure」という警告は、Webサーバが安全な通信を行っていない、つまりHTTPSによる暗号化がなされていないことを示しています。この状態だとユーザーのデータが第三者に傍受されるリスクがありますし、サイトの信頼性にも影響を与えます。

今回は「HTTPS化」することにより、ユーザーに安心して利用してもらえるようなWebサーバを構築していきます。
HTTPS化のプロセスは、特に初心者にとっては複雑に感じられるかもしれません。
ただ、、、、実は、、、私も使っているConoHa VPSでは、HTTPS化に必要なSSL/TLS証明書を数クリックで取得できてしまうんですね。時間短縮してサーバ構築するにこれだけ便利なことはありません。
今回はこの機能は使用しませんが、ConoHa VPSはレンタルサーバとしてはとても優秀ですので、是非この機会にお申し込みください。

それでは始めていきましょう。
開発環境
今回の開発環境を以下に書きます。
<接続先VPSサーバ情報>
サーバ:ConoHa VPS
OS:Ubuntu22.04
・Apacheインストール済み
・UFWインストール済み
・SSH設定(公開鍵認証を設定済み)
そもそもHTTPSって?
安全に通信する仕組みのことです。
例えでよく言われるのが、HTTPは封筒なしで手紙を送るようなものです。誰でも内容を見ることができるのに対して、HTTPSは鍵付き封筒で手紙を送るイメージです。SSL/TLS証明書がその鍵の役割を担います。
この手紙は秘密鍵を持つ受取人だけが内容を確認できます。これにより、インターネット上で情報を安全に保ち、漏洩や改ざんを防ぎます。HTTPSはWebサイトの信頼性と安全性を高めるために不可欠なものとなっています。
SSL/TLS証明書にはサーバーの身元情報が含まれており、認証局によってその正当性が保証されます。ユーザーがアクセスしているサイトは偽物でないことが保証される訳です。
HTTPS化に向けたロードマップ
・Let’s EncryptでSSL/TLS証明書を取得します。
・Apacheの設定をしてHTTPS通信を有効にします。
・HTTPS通信で利用する443番ポートを開放します。
・HTTP通信でアクセスした場合にHTTPSとしてリダイレクトする設定をします。
SSL/TLS証明書の取得及びApacheの設定
Let’s Encrypt からSSL/TLS サーバー証明書を取得します。Let’s Encrypt は ンターネットセキュリティ研究グループ(ISRG)によって提供される証明書認証局(CA)です。発行料無料でSSL/TLS証明書を取得することができます。
今回はLet’s Encrypt からSSL/TLS証明書を取得して、Webサーバーへ自動で設定できるツールの「Certbot」を使用して快適に作業を進めていきます。
sudo apt update #パッケージリストの更新
sudo apt install software-properties-common #リポジトリ追加の準備
sudo add-apt-repository universe #「universe」リポジトリの追加
sudo apt update #「universe」リポジトリを含むパッケージリストの更新
sudo apt install certbot python3-certbot-apache # ApacheのWebサーバーに設定するためのツール
「Cerbot」を実行します。
sudo certbot --apache
eメールアドレスやドメイン名を要求されるので入力しましょう。ドメイン名は「arisan-japan.com」といった感じです。
ここで問題が発生。
Deploying certificate
Successfully deployed certificate for sana-dev1.com to /etc/apache2/sites-available/000-default-le-ssl.conf
Error while running apache2ctl configtest.
Action 'configtest' failed.
The Apache error log may have more information.
AH00526: Syntax error on line 31 of /etc/apache2/sites-enabled/000-default.conf:
Name duplicates previous WSGI daemon definition.
We were unable to install your certificate, however, we successfully restored your server to its prior configuration.
NEXT STEPS:
- The certificate was saved, but could not be installed (installer: apache). After fixing the error shown below, try installing it again by running:
certbot install --cert-name sana-dev1.com
Error while running apache2ctl configtest.
Action 'configtest' failed.
The Apache error log may have more information.
AH00526: Syntax error on line 31 of /etc/apache2/sites-enabled/000-default.conf:
Name duplicates previous WSGI daemon definition.
要約すると「証明書取得はできたけど、Apacheへの設定ができないよ。」というエラー。
原因は「/etc/apache2/sites-available/000-default.conf」の「WSGIDaemonProcess」にあることがわかりました。「WSGIDaemonProcess」はWSGIのプロセス名を定義する項目です。
この「000-default.conf」はHTTP通信(80番ポート)に関わる設定がされています。「sudo certbot --apache
」のコマンドにより「000-default.conf」をコピーしてHTTPS通信(443番ポート)のファイルを作成しようとするのですが、その際に「WSGIDaemonProcess」の項目が80番用ファイルと443番要ファイルで重複してしまうことによりエラーが発生します。
1ServerName sana-dev1.com
2WSGIDaemonProcess api_project python-path=/var/www/app python-home=/var/www/app/venv
3#↑失敗した原因。コメントアウトすることで解消する。
4WSGIScriptAlias / /var/www/app/app.wsgi
5
6<Directory /var/www/app>
7 WSGIProcessGroup api_project
8 WSGIApplicationGroup %{GLOBAL}
9 Require all granted
10</Directory>
そのため、この「WSGIDaemonProcess」の行をコメントアウトして「sudo certbot --apache
」を実行しましょう。同じパスの中に「000-default-le-ssl.conf」ができます。こちらがHTTPS用のファイルとなります。このファイル内の「WSGIDaemonProcess」をコメントアウト解除しましょう。
SSL/TLS証明書の確認
ここではGoogle Chromeでの証明書確認方法について解説します。まずはサイトにアクセスしてURL左にあるマークを押します。「Connection is secure」→「Certificate is valid」を押すと証明書を確認することができます。「Expired On」の項目が証明書の有効期限を示しています。

SSL/TLS証明書の自動更新設定
証明書には期限があって期限を超えるとHTTPS通信ができなくなります。毎回、手動で証明書を取得するのも面倒くさいので、証明書の自動更新設定をします。
以下のコマンドを実行して証明書が更新されるかテストしてみましょう。「Congratulations, all simulated renewals succeeded:
」でれば成功です。
$ sudo certbot renew --dry-run
[sudo] password for hogehoge:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/hogehoge.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for hogehoge.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/hogehoge.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
次にタイマーの設定をします。以下のコマンドを打つと「Mon 2024-03-04 05:43:35 JST 12h left」と表示されてます。これは「2024年3月4日の05:43:35 JSTに証明書を更新します。」という意味になります。自動更新のタイマーはセットされていたので対応不要です。
$ systemctl list-timers | grep certbot
Mon 2024-03-04 05:43:35 JST 12h left Sun 2024-03-03 13:57:28 JST 3h 7min ago certbot.timer certbot.service
もし、タイマーがセットされてない場合は追加する必要があります。例えば毎日午前2時に自動実行するには以下のコマンドを実行します。
echo "0 2 * * * root certbot renew" | sudo tee -a /etc/cron.d/certbot
「0 2 * * *」は以下を表しています。
0
: 分 :毎時0分。2
: 時 :2時。*
: 日 :月の中のどの日でも。*
: 月 :年中どの月でも。*
: 曜日:週のどの曜日でも。
最後に以下のコマンドを実行してタイマーを有効にしてください。
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
これで終わりです。
ファイアウォールの設定
次にファイアウォールの設定をします。HTTP通信の場合、サーバの80番ポートを使用します。一方で、HTTPS通信の場合、サーバの443番ポートを使用します。そのため、新たにポートの許可をする必要があります。
ConoHa VPSの設定
ConoHa VPS管理画面の「セキュリティ」を押して「セキュリティグループ」に「IPv4v6-Web」を設定しましょう。これで443番ポートが許可されたことになります。

UFWの設定
UFWはLinuxで使用されるファイアウォール管理ツールです。以下のコマンドで443番ポートの通信を許可してください。
sudo ufw allow 443/tcp #443番ポートを許可
sudo ufw status #追加されたことの確認
To Action From
-- ------ ----
443/tcp ALLOW Anywhere
443/tcp (v6) ALLOW Anywhere (v6)
これでOKです。
リダイレクトの設定
最後にリダイレクトの設定をします。リダイレクト設定をすることで「http://arisan-japan.com」でアクセスしてきた際に「https://arisan-japan.com」でアクセスし直すことができます。
実は既に設定されてます。
「sudo certbot --apache
」のコマンドで443番ポート用の「000-default-le-ssl.conf」を作りました。80番ポート用の「000-default.conf」を見ると、下3行にリダイレクト用の記載があります。
ServerName hogehoge.com
# WSGIDaemonProcess api_project python-path=/var/www/app python-home=/var/www/app/venv
#↑80番ポートは使わないのでコメントアウトしてある。
WSGIScriptAlias / /var/www/app/app.wsgi
<Directory /var/www/app>
WSGIProcessGroup api_project
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
RewriteEngine on #追加されてる!
RewriteCond %{SERVER_NAME} =hogehoge.com #追加されてる!
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] #追加されてる!
もし、記述がなれば手動で追加すればリダイレクトの設定ができます。ブラウザのURL入力欄からHTTPを使ってアクセスしてみてください。アクセスした先のURLがhttpsに変わっていればリダイレクトできたことになります。
以上で全手順完了です。今回はWebサーバをHTTPS化する手順を公開しました。