Amazon Linux2でLet’s Encryptを使う方法

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。タクマ™ [@suwaru_blog] です。

最近は https:// でサイト公開することが Web の常識になってきています。

Let’s Encrypt というところから証明書を取得するとお金がかからないので、
まだ HTTPS 対応していない人は今すぐ対応したほうがよいです。

…しかし、ここで AWS の EC2 で Amazon Linux2 という AMI を使っていると、
Let’s Encrypt を使うための設定ファイル修正が必要になってきます。

これは非常によく使う AMI ですし、初心者にとって少しわかりにくいところだと思います。

今回は Amazon Linux2 で Web サーバは Apache を使っている場合における、
Let’s Encrypt で HTTPS 対応するまでの手順を解説します!

(追記) 2021 年 10/1 現在 certbot-auto がサポートされなくなったようです。yum update のあと yum install certbot して certbot コマンドを代わりに使うようにしてみてください。また Let’s Encript の R3 証明書が本日から失効しています。この証明書を使わないようにするコマンドを記事に追記しておきます。

今回は http://eeeeg.tokyo というサイトが既にあって、
それを https://eeeeg.tokyo にする、という想定で話をしていきます。

EC2 セキュリティグループ

AWS のコンソールから EC2 を開いて、セキュリティグループをメニューを開いてください。
インバウンドルールで HTTPS を許可しておきます。

certbot-auto

su コマンドを使えるようにしておく

su コマンドを使ったことがない場合はパスワード設定が必要です。

sudo su -
passwd

New password: (パスワード入力)
Retype new password: (もう一度入力) 

certbot-auto のインストール

Let’s Encrypt から証明書を取得するために cert-bot-auto というものをインストールします。

# パスワード入力して、管理者ユーザに切り替える
su

# certbot-auto をインストールする
sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo chmod 700 /usr/bin/certbot-auto

# certbot-auto ファイルのバックアップを作成する
cp /usr/bin/certbot-auto /usr/bin/certbot-auto.bak

vi /usr/bin/certbot-auto

certbot-auto 設定ファイルの編集

「 Amazon」という文字列で検索すると、以下の場所が引っかかります。

elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

上記をコメントアウトして、下記を追記してください。

 elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || \
   grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
# コメントアウト
# elif [ -f /etc/issue ] && grep -iq "Amazoninux" /etc/issue ; then
#   Bootstrap() {
#     ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
#   }
#   BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

Amazon Linux2 は新しい AMI なので、その判定がないので追加してあげています。

Let’s Encrypt から証明書を取得する

certbot-auto を PATH が通った場所に移動しておきましょう。

sudo mv /usr/bin/certbot-auto /usr/local/bin

sudo certbot-auto certonly --webroot -w [ドキュメントルート] -d [ドメイン] --email [メールアドレス] --debug を実行してください。僕は以下のように実行しました。

# 必要なパッケージも一緒にインストールされる
sudo certbot-auto certonly --webroot -w /var/www/html/web-EeeeG -d eeeeg.tokyo --email takuma.ikeda@eeeeg.tokyo --debug

(追記) 2021 年 10/1 以降は certbot をインストールして、下記を参考にしてください。
sudo certbot certonly --webroot -w /var/www/html/web-EeeeG -d eeeeg.tokyo --email takuma.ikeda@eeeeg.tokyo --preferred-chain "ISRG Root X1" --debug

これで Let’s Encrypt から証明書が発行されます。

この直後に確認メールが飛んでくるので、本人確認をしておいてください。

Apache をリバースプロキシとして使っている場合

Apache をリバースプロキシとして使っていない人は、次の手順に進んでください。

たとえば Node.js や GO といった言語だと http://localhost:ポート で Web サーバを起動させて、
Apache をリバースプロキシとして使いたいことがあると思います。

その場合の --webroot ってどこ?…ということで、以下エラーが出ることがあります。

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: eeeeg.tokyo
   Type:   unauthorized
   Detail: Invalid response from
   http://eeeeg.tokyo/.well-known/acme-challenge/[英数字]

[後略]

Let’s Encrypt が http://eeeeg.tokyo/.well-known/acme-challenge/[英数字]  という場所に HTTP でアクセス確認しようとしていますが、失敗しています。

これを回避するために VirtualHost を使う方法もありますが、
実際にドキュメントルート配下に .well-known/acme-challenge/[英数字] を作るのが簡単です。

cd [ドキュメントルート]
sudo mkdir -p .well-known/acme-challenge/[英数字]
sudo vi /etc/httpd/conf/httpd.conf

httpd.conf の最終行あたりに Location ディレクティブを追記します。

/etc/httpd/conf/httpd.conf

# Let'e Encrypt
<Location /.well-known/>
    ProxyPass !
</Location>

これで cert-bot-auto コマンドで証明書を取得できるはずです。

Apache の SSL 設定ファイルを編集する

# cert.pem / privkey.pem / chain.pem が作成されていることを確認する
ll /etc/letsencrypt/live/[ドメイン]

# Apache の SSL 設定ファイルを編集します
vi /etc/httpd/conf.d/ssl.conf

下記の修正を加えてください。
[ドメイン]certbot-auto に渡したドメインと一致します。

  • SSLCertificateFile で文字列検索する
    • SSLCertificateFile /etc/letsencrypt/live/[ドメイン]/cert.pem に修正する
  • SSLCertificateKeyFile で文字列検索する
    • SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン]/privkey.pem に修正する
  • SSLCertificateChainFile で文字列検索する
    • SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン]/chain.pem に修正する

httpd -tsudo apachectl configtest で文法に誤りがないかチェックしてください。
問題がなければ Apache を再起動します。

# Appache 再起動
sudo service httpd restart

HTTPS アクセスしてみる

これで準備完了です。https://ドメイン でアクセスできるか確認してみましょう。

# コマンドで疎通確認する場合
curl -s -v --sslv3 https://eeeeg.tokyo 1> /dev/null

リバースプロキシしていて HTTPS 接続が上手くいかない場合

Apache の VirtualHost でポート 403 の設定が上手くいっていないと、
curl コマンドで、以下のようなエラーが返ってくるかもしれません。

curl --verbose https://eeeeg.tokyo
 
curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

このエラーに遭遇したときの Apache 設定を解説しています。参考にしてみて下さい。

証明書更新コマンド

3 ヶ月ごとにコマンドで証明書を更新する必要があります。

# パスワード入力して、管理者ユーザに切り替える
su

# 証明書更新
/usr/local/bin/certbot-auto renew --post-hook "sudo service httpd restart"

(追記) 現在は下記コマンドで更新するようにしてください。
/usr/local/bin/certbot renew --post-hook "sudo service httpd restart"

関連記事

お仕事ください!

僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。
なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。

カテゴリ「AWS」の最新記事

最新記事

コメント

コメントを残す

*