Let's Encryptを使ったHTTPS化

HTTPS化

このブログはhexoを使って表示しています。
以前HTTPSにしないとサイトの評価が上がらないと言われていたので、HTTPSにしようと思います。
できるだけ管理に手間をかけたくないので、Let’s Encryptを利用しようと思います。

Let’s Encryptについて

恥ずかしながらLet’s Encryptを利用するのは今回が初めてです。なので、本家のサイトをまず見てみます。
ドキュメントを上から読んでいくと、以下のことがわかります。

  • ACMEプロトコルを利用している
  • 証明書を設置するサーバにSSHログインできる場合、CertbotというACMEクライアントを利用する
  • ドメイン検証 (Domain Validation; DV) 型の証明書
  • 無料で利用できる

想定としてはリバースプロキシとしてnginxを動かして、フォワード先をhexoとします。
では早速進めていきたいと思います。

Certbot

Let’s EncryptのACMEクライアント実装というページでもCertbotをおすすめしています。とりあえずこれをインストールしてみようと思います。
Certbotのページにいくと、My HTTP Website is runningという表示があります。そのセレクトボックスに自分の環境のHTTPサーバ、OSを指定します。

AmazonLinux2のベースはなに?

OSを選ぼうとしたらAmazonLinux2の文字はありませんでした。そう言われるとAmazonLinux2のベースのOSはなんだろう?と思いました。
ググってみるとCentOS/RHEL 7のようです。yumが利用できるのでRedHat系かとは思っていましたが、RHEL7ベースのようなのでそれを選択しました。

Certbotのインストール

SoftwareNginxSystemCentOS/RHEL 7を選択すると、ページ下にインストール方法が表示されれます。
その手順通りに進めていきます。

サーバーにログインします

ログインします

EPELリポジトリを有効にします

今有効になっているリポジトリ一覧を見てみます。

1
2
3
4
5
6
7
8
9
10
$ sudo yum repolist all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID リポジトリー名 状態
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 有効: 19,545
amzn2-core-debuginfo/2/x86_64 Amazon Linux 2 core repository - debugin 無効
amzn2-core-source/2 Amazon Linux 2 core repository - source 無効
!amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 有効: 24
amzn2extra-docker-debuginfo/2/x86_64 Amazon Extras debuginfo repo for docker 無効
amzn2extra-docker-source/2 Amazon Extras source repo for docker 無効
repolist: 19,569

有効になっていないようなので有効にします。
有効にする方法はこちらに記載されていました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
epel-release-latest-7.noarch.rpm | 15 kB 00:00:00
/var/tmp/yum-root-HHwmTy/epel-release-latest-7.noarch.rpm を調べています: epel-release-7-12.noarch
/var/tmp/yum-root-HHwmTy/epel-release-latest-7.noarch.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-12 を インストール
--> 依存性解決を終了しました。
amzn2-core/2/x86_64 | 2.4 kB 00:00:00
amzn2extra-docker/2/x86_64 | 1.8 kB 00:00:00

依存性を解決しました

==========================================================================================
Package アーキテクチャー
バージョン リポジトリー 容量
==========================================================================================
インストール中:
epel-release noarch 7-12 /epel-release-latest-7.noarch 24 k

トランザクションの要約
==========================================================================================
インストール 1 パッケージ

合計容量: 24 k
インストール容量: 24 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : epel-release-7-12.noarch 1/1
検証中 : epel-release-7-12.noarch 1/1

インストール:
epel-release.noarch 0:7-12

完了しました!

次にepelを有効にします。

1
2
3
4
5
6
$ sudo yum-config-manager --enable epel
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
======================================= repo: epel =======================================
[epel]
async = True
(省略)

有効になったかを確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ sudo yum repolist all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
192 packages excluded due to repository priority protections
リポジトリー ID リポジトリー名 状態
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 有効: 19,545
amzn2-core-debuginfo/2/x86_64 Amazon Linux 2 core repository - deb 無効
amzn2-core-source/2 Amazon Linux 2 core repository - sou 無効
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 有効: 24
amzn2extra-docker-debuginfo/2/x86_64 Amazon Extras debuginfo repo for doc 無効
amzn2extra-docker-source/2 Amazon Extras source repo for docker 無効
epel/x86_64 Extra Packages for Enterprise Linux 有効: 13,061+192
epel-debuginfo/x86_64 Extra Packages for Enterprise Linux 無効
epel-source/x86_64 Extra Packages for Enterprise Linux 無効
epel-testing/x86_64 Extra Packages for Enterprise Linux 無効
epel-testing-debuginfo/x86_64 Extra Packages for Enterprise Linux 無効
epel-testing-source/x86_64 Extra Packages for Enterprise Linux 無効
repolist: 32,630

有効になっていますね。epelのその他のリポジトリも有効にすれば利用できるようになっていました。

optional channelを有効にする

パッケージyum-utilsはインストール済だったので、有効にするコマンドのみ実行します。
記載のコマンドのREGIONはap-northeast-1に置き換えて実行してみます。

1
2
$ sudo yum-config-manager --enable rhui-ap-northeast-1-rhel-server-extras rhui-ap-northeast-1-rhel-server-optional
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd

特に変化はなさそうですが、一旦次に進んでみます。

Certbotをインストール

次のコマンドを実行します。

1
2
3
$ sudo yum install certbot python2-certbot-nginx
(省略)
完了しました!

Certbotの実行

CertbotがNginxの設定を書き換えると書いてあります。
まだNginxの準備ができていないので、そちらを行います。

1
2
3
$ sudo yum install nginx.x86_64
(省略)
完了しました!

Nginxのインストールが完了したので、hexoへリバースプロキシをする設定を追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vi /etc/nginx/conf.d/hexo.conf
server {
server_name book-reviews.blog;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location / {
proxy_pass http://localhost:8080/;
}
}

hexoのポートも80から8080に変更しています。

Nginxを起動しておかないとCertbotの実行でエラーが出るので起動しておきます。

1
$ sudo systemctl start nginx

準備が整ったのでCertbotを実行します。

1
2
3
4
5
6
7
8
9
10
$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: book-reviews.blog
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

設定ファイルから自動的にドメインを認識してくれるので該当するドメインを選択します。

1
2
3
4
5
6
7
8
9
10
11
(中略)
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
server {
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/hexo.conf

HTTPのアクセスをHTTPSへリダイレクトするかどうか聞かれるので、リダイレクトするを選びました。nginxの設定に301redirectが追記されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://book-reviews.blog

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=book-reviews.blog
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
(中略)
Your cert will expire on 2020-08-04. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot 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

ということで無事インストールが終わりました。

1
2
3
Your cert will expire on 2020-08-04. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option.

ということなので、2020年8月4日には有効期限が切れてしまうようです。またその際にcertonlyオプションをつけて実行します。

HTTPSアクセスを試す

今このページもHTTPSで表示されていると思いますが、無事表示されました!
HTTPアクセスもちゃんとリダイレクトされます!

まとめ

初めてLet’s EncryptでHTTPS化しましたが、とても楽でした!Certbotのおかげだと思います!
ここには記載しなかったですが、Hexoのsystemdでの起動でちょっとつまずきました。
この点については近いうちに記載したいと思います。

※追記 こちらに記載しました。