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 対応するまでの手順を解説します!

今回は 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 eeeeg.takuma.ikeda@gmail.com --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

    ProxyPass !

これで 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"

関連記事

お仕事ください!

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

コメント

コメントを残す

*