こんにちは。iQeda [@iQeeeda] です。
最近は https://
でサイト公開することが Web の常識になってきています。
Let’s Encrypt というところから証明書を取得するとお金がかからないので、
まだ HTTPS 対応していない人は今すぐ対応したほうがよいです。
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 -t
や sudo 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」の最新記事
コメント