なうびるどいんぐ

脳みそ常時-3dB

RaspbianでLet's Encrypt(certbot)の自動更新に失敗する

      2019/06/16    HimaJyun

自宅Piサーバー群でLet's Encryptの証明書が期限切れを起こしていたので何事かと思えば、自動更新に失敗していました。

「THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE」とか言ってpipが失敗するという症状。解決策を書いておく。

スポンサーリンク

ここでいう自動更新とは自動で証明書を更新するアレではなく、Let's Encrypt起動時に発生する自動更新です。(まぁ、この自動更新がコケると後の証明書取得もコケるので、結果的にはどちらの自動更新も失敗するのですが)

最初に答え

certbotをソースコードからインストールしているのなら、aptでのインストールに切り替え。

それか、/etc/pip.confを修正。

事象

Gitからソースコードを取得して使用しているcertbot-autoがコケる。

より具体的には、certbot起動時に行われる自動更新がしばらく停止した後、以下のようなエラーでこける

Upgrading certbot-auto 0.34.2 to 0.35.1...
Replacing certbot-auto...
Creating virtual environment...
Had a problem while installing Python packages.

pip prints the following errors: 
=====================================================
Collecting ConfigArgParse==0.14.0 (from -r /tmp/tmp.rE8hoJQm1K/letsencrypt-auto-requirements.txt (line 7))
  Downloading https://files.pythonhosted.org/packages/55/ea/f0ade52790bcd687127a302b26c1663bf2e0f23210d5281dbfcd1dfcda28/ConfigArgParse-0.14.0.tar.gz
~~~ 略 ~~~
Collecting certbot-nginx==0.35.1 (from -r /tmp/tmp.rE8hoJQm1K/letsencrypt-auto-requirements.txt (line 213))
  Downloading https://files.pythonhosted.org/packages/4d/14/873c84be613c88da239b9823c88e36e52a77e6be1027de9ce9442d0cbdd9/certbot_nginx-0.35.1-py2.py3-none-any.whl (86kB)
Requirement already satisfied: setuptools>=1.0 in /opt/eff.org/certbot/venv/lib/python2.7/site-packages (from josepy==1.1.0->-r /tmp/tmp.rE8hoJQm1K/letsencrypt-auto-requirements.txt (line 87))
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    pycparser==2.19 from https://www.piwheels.org/simple/pycparser/pycparser-2.19-py2.py3-none-any.whl#sha256=344870c533812cb119c5475b5aed033ec546118711338ff9b2b78e67098d64e7 (from -r /tmp/tmp.rE8hoJQm1K/letsencrypt-auto-requirements.txt (line 105)):
        Expected sha256 a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3
             Got        344870c533812cb119c5475b5aed033ec546118711338ff9b2b78e67098d64e7
=====================================================

Certbot has problem setting up the virtual environment.

We were not be able to guess the right solution from your pip 
output.

Consult https://certbot.eff.org/docs/install.html#problems-with-python-virtual-environment
for possible solutions.
You may also find some support resources at https://certbot.eff.org/support/ .

エラーメッセージを読めば分かる話なのだが、pipでインストールしようとしているpycparserのハッシュ値が一致していない。

原因

これに関しては公式のフォーラムにも質問が投稿されている。

斜め読みで解説すると、Raspbian固有の問題。

Raspbianではデフォルトだとpipでのパッケージインストールを高速化するために、piwheels.orgからWheels(コンパイル済みのバイナリ)を取得するようになっている。(非力なRasPiでコンパイルをするのは遅いので)

そのせいで本来のWheelsから取得できるものとは別の物が降ってくるので、ハッシュが一致しなくなって……という具合。

解決法

先のフォーラムで提示されている解決策として、いちばん楽なのはcertbotをaptでのインストールに変更する事。

sudo apt install certbot

他の解決策として、どうしてもソースコードからインストールする必要があるのなら/etc/pip.confを修正する事。

[global]
extra-index-url=https://www.piwheels.org/simple

このextra-index-url行を削除するなり、コメントアウトするなり、/etc/pip.confを削除してしまうなり……

ただしこれをやるとpipを使う他のソフトウェアにまで影響を及ぼす(具体的には、pipでのパッケージインストールが遅くなる)ので、黙ってaptでインストールする方が良いと思う。

更に他の解決策として、ハッシュを書き換えるとか紹介されてるサイトもあるが……根本的な解決になっていないので再発必須だと思われる。

(ハッシュを書き換えるくらいなら/etc/pip.confextra-index-urlを一時的にコメントアウトする方が良いと思うよ)

 - サーバー