Blogブログ

2020.09.07

Amazon Linux 2 AMIになってからletsencryptがスムーズにいかない

どのサイトでも簡単と言ってるのに、
AmazonLinux2AMIになってから実際にやってみるとハマってしまう。

という話を聞いたので、実際にやってみようと思います。

AWSのEC2でAuto-assign Public IPをenableにしつつ
portは22 443 80をanywhereで開けているとしましょう。

ec2立ち上げるところからやりますね。

早めに名前をつけてなんのサーバーかわからなくなるようにしたほうがいいですよ。(自戒)

さて、ログインしてみます。

もちろんpemをchmod 400 XXXX.pemで変えてからログインします。

ssh -i "XXX.pem" ec2-user@ec2-11-111-111-111.ap-northeast-1.compute.amazonaws.co

みたいな感じで、ログインするのは大丈夫かと思います。

では、通常のLAMPでも参考にドキュメントルート通します。

チュートリアルは本家がいいですよ。

sudo yum update -y
sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
sudo yum install -y httpd mariadb-server
sudo systemctl start httpd
sudo systemctl enable httpd
sudo usermod -a -G apache ec2-user
sudo chown -R ec2-user:apache /var/www
sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;

はい。
ここまでを実行したらIPでアクセスしてみましょう。

あとで消しちゃいますが
いったんIPは13.113.180.141でやります。

ふむ。うまくいってますね。(当たり前やろー)

ではローカルの/etc/hostsに
studystudy.spread.fanというようなドメインを設定してみます。

13.113.180.141 studystudy.spread.fan

こんな感じで書いてみます。

はい。
studystudy.spread.fan
でも同じ画面が見れるようになりました。

では、DNSの設定をしていきましょう。

お名前ドットコムでセットしてみましょう。

お名前ドットコムにログインしたらドメインを購入し、
メニューの
DNS→ドメインのDNS関連機能設定→ドメインのDNS関連機能設定
→そしてドメインを選択→次へ→DNSレコード設定を利用する

そして
Aレコードに13.113.180.141をセットして確認画面へ進み、
設定を押します。

うまく行ったようだな。

ではletsencryptの設定をしていきましょう。

sudo su -
sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo chmod 700 /usr/bin/certbot-auto
cd /usr/bin
chmod a+x certbot-auto

ここでpythonのパスを確認してみましょうか。

echo $PYTHONPATH

見事に何もないですね当たり前ですが。

ふむ

たぶんこのままletsencryptのコマンドを実行するとうまくいかないのだと思います。

やってみましょう。

certbot-auto certonly –webroot -w /var/www/html -d studystudy.spread.fan –email yamamoto@field.asia -n –agree-tos –debug –no-self-upgrade

ちなみにcertbotが最新にすると動かないことがあるようなので勝手にアップデートしないように–no-self-upgradeをつけるようです

[root@ip-192-168-1-176 bin]# certbot-auto certonly --webroot -w /var/www/html -d studystudy.spread.fan --email yamamoto@field.asia -n --agree-tos --debug --no-self-upgrade
Sorry, I don't know how to bootstrap Certbot on your operating system!

You will need to install OS dependencies, configure virtualenv, and run pip install manually.
Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
for more info.

うむ。確かにうまくいかないですね。

run pip install manuallyって書いてあるのでpipとかを入れていきます。

easy_install-2.7 pip

バージョンを確認してみましょう。

[root@ip-192-168-1-176 bin]# pip --version
pip 20.2.2 from /usr/lib/python2.7/site-packages/pip-20.2.2-py2.7.egg/pip (python 2.7)
[root@ip-192-168-1-176 bin]# python --version
Python 2.7.18

2.7系か…
/usr/lib/python2.7/site-packagesということがわかったので、

はい。念のためpathを通します。

vim ~/.bashrc

で、中身をこれにします。

# .bashrc
  
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export PYTHONPATH="${PYTHONPATH}:/usr/lib64/python2.7/site-packages/"
~                                                                         

で、保存したら
bash
と実行して反映します

これでそれぞれバージョンやパスを確認してみましょう。

[root@ip-192-168-1-176 bin]# python --version
Python 2.7.18
[root@ip-192-168-1-176 bin]# pip --version
pip 20.2.2 from /usr/lib/python2.7/site-packages/pip-20.2.2-py2.7.egg/pip (python 2.7)
[root@ip-192-168-1-176 bin]# echo $PYTHONPATH
:/usr/lib64/python2.7/site-packages/
[root@ip-192-168-1-176 bin]# virtualenv --version
bash: virtualenv: command not found

ふむ。virtualenvを念のためインストールしましょう。
pip install virtualenv==15.1.0
を実行

たぶんこれで、さっきのletsencryptは動くと思います。

[root@ip-192-168-1-176 bin]# sudo certbot-auto certonly --webroot -w /var/www/html -d studystudy.spread.fan --email yamamoto@field.asia -n --agree-tos --debug --no-self-upgrade
Sorry, I don't know how to bootstrap Certbot on your operating system!

You will need to install OS dependencies, configure virtualenv, and run pip install manually.
Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
for more info.

あれ・・?動かない。。。
https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
ここを見てっていってますね。

アクセスしてみましょう。

なんだと・・?

alternatives --set python /usr/bin/python2.7

これかな・・・。

いやダメですね。。

ここでサッカーならかかってもないスライディングを受けたていで
whyと言いながら倒れることもできるのですが、、
それはできないのでもうちょっと見てみます。

試しにamazon linux1 ami で試しにやってみたら一瞬でできました。
amazon linux2 amiは確かにパッとできなくなってますね。

大貴くんに聞くか…

というわけで僕がやってみました
(大貴です)

[ec2-user@ip-192-168-1-176 etc]$ pip --version
pip 9.0.3 from /usr/lib/python2.7/site-packages (python 2.7)
[ec2-user@ip-192-168-1-176 etc]$ pip show virtualenv
Name: virtualenv
Version: 15.1.0
Summary: Virtual Python Environment builder
Home-page: https://virtualenv.pypa.io/
Author: Jannis Leidel, Carl Meyer and Brian Rosner
Author-email: python-virtualenv@groups.google.com
License: MIT
Location: /usr/lib/python2.7/site-packages
Requires:
[ec2-user@ip-192-168-1-176 etc]$ python --version
Python 2.7.18

おそらく、各種バージョンは問題ないと思います。
一旦バージョンは大丈夫なものとして別な原因を探りましょう。

[root@ip-192-168-1-176 bin]# sudo certbot-auto certonly --webroot -w /var/www/html -d studystudy.spread.fan --email yamamoto@field.asia -n --agree-tos --debug --no-self-upgrade

Sorry, I don't know how to bootstrap Certbot on your operating system!

You will need to install OS dependencies, configure virtualenv, and run pip install manually.
Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
for more info.

ところで上記のエラー見たことがないですね。
僕は初めてLet’e encryptでssl化を試みたときに死ぬほど詰まったことがありますが、こんなエラーメッセージは初めてです。

新手のエラーかなと思いググってみるとこんな記事が。

どうやら現状のcertbot-autoはデフォルトではAmazon linux 2というOSに対応しておらず(というより読み込み対象から外されている?)、

記述を追加してあげる必要があるようです。
なので記事通りに、

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
  }

このようにcertbot-autoに記述しました。
再度実行すると上記のエラーは消え、なんだかうまくいきそう。

Exiting abnormally:
Traceback (most recent call last):
  File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 11, in <module>
    sys.exit(main())
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/main.py", line 15, in main
    return internal_main.main(cli_args)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/main.py", line 1357, in main
    return config.func(config, plugins)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/main.py", line 1237, in certonly
    lineage = _get_and_save_cert(le_client, config, domains, certname, lineage)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/main.py", line 121, in _get_and_save_cert
    lineage = le_client.obtain_and_enroll_certificate(domains, certname)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/client.py", line 418, in obtain_and_enroll_certificate
    cert, chain, key, _ = self.obtain_certificate(domains)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/client.py", line 351, in obtain_certificate
    orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/client.py", line 398, in _get_order_and_authorizations
    authzr = self.auth_handler.handle_authorizations(orderr, best_effort)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/auth_handler.py", line 91, in handle_authorizations
    self._poll_authorizations(authzrs, max_retries, best_effort)
  File "/opt/eff.org/certbot/venv/lib/python2.7/site-packages/certbot/_internal/auth_handler.py", line 180, in _poll_authorizations
    raise errors.AuthorizationError('Some challenges have failed.')
AuthorizationError: Some challenges have failed.
Please see the logfiles in /var/log/letsencrypt for more details.

ログファイルをみるとどうやらapacheの設定の方に問題がありそうでした。
いつもの通り、80番ポートにServer Nameなどを記述し再度チャレンジ!

Error: urn:ietf:params:acme:error:rateLimited :: There were too many requests of a given type :: Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/

や、、やられました、、
1つのドメインに対してチャレンジ回数の上限を超えてしまったようです、、
証明書の取得数に上限があるのは知っていましたが、チャレンジにも上限があるんですね、、

確か数日おかないと復活しないものだったと思います。ひとまず報告し、後日再チャレンジします。。

さて1週間が経ちました(大貴です)

お待たせしました。前回certbotコマンドをブロックされてから1週間が経ちました。無事ブロックは解除されていたようで、再チャレンジができました。

(apacheの設定の方に問題があるとかでまごついてしまったのですが、実はドメインの向き先サーバーの設定にタイポがあったことは内緒です)

今後Amazon Linux 2でlet’s encryptでssl証明書を取得する際は各種バージョンも上記に揃えた上で、certbot-autoファイルに記事通り記述してあげたら問題なさそうかなと。

あとちなみにですが、取得する際にはcertonlyとつけないで下記だけ実行してあげればドメインやらメールアドレスやら対話的にコマンド実行できます。そしてapacheの443ポートの設定まで勝手にやってくれるのでコマンド成功時点でもうssl化ができちゃいます。個人的にはこちらが好みです。(–debug -vで取得に成功したら証明書の中身もlessコマンド的に表示してくれるので「あー取得できたんだな」とわかって心理的安全性が高まります笑)

./certbot-auto --debug -v --no-self-upgrade

さて、ssl証明書も取得し後日談も無事お知らせできましたので、僕の役目はここまでですね。最後は弊社代表の山本CEOにバトンタッチして今回のlet’s encryptでのssl化の旅を締めくくって頂こうかと思います!

こんにちは山本です。

久々にブログをみたら名指しで指名をされていたので書かないとと思いつつ
面倒だったのでかなりな時間が経ってしまいました。

letsencryptがlinux2をサポートしていないためにcertbot-autoに認識させる記述を書かないと動かないという内容が上で書かれていますね。

ちょっと色々とみたんですが、

実は簡単な方法がありました。

まず、新しくサーバーを立ててみました。
apacheではなくてnginxを使ってみましょうか。

extraを使ってリポジトリからインストールします。

nginx1だということを確認。

[ec2-user@ip-192-168-1-179 ~]$ amazon-linux-extras list
 
 38  nginx1                   available    [ =stable ]
sudo amazon-linux-extras install nginx1 を実行
/etc/nginxで、server_name にドメインを追記編集
sudo systemctl enable nginx を実行
sudo systemctl start nginx を実行
sudo wget -r --no-parent -A 'epel-release-*.rpm'  http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/ を実行
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm を実行
sudo yum install certbot python2-certbot-nginx を実行
sudo certbot --nginx を実行

対話形式で、メールや同意文やドメインを聞かれるので入力。
すると…

[root@ip-192-168-1-179 studystudy.spread.fan]# ls
README  cert.pem  chain.pem  fullchain.pem  privkey.pem
[root@ip-192-168-1-179 studystudy.spread.fan]# pwd
/etc/letsencrypt/live/studystudy.spread.fan

完了しました。

この方法でssl化をするとスムーズで良いと思います。

(上記タイポに関しては土下座でだいきくんに誤っておきました。)

letsencryptの更新について

sudo crontab -u root -e
で、cronを編集して、
0 0,12 * * * root certbot renew --no-self-upgrade
と追記で、自動的に更新し続けてくれます。

以上です。