VTRyo Blog

一歩ずつ前に進むブログ

amazon linuxで取得した証明書更新時のエラー対処

f:id:vtryo:20180714225953p:plain

Let’s Encryptって便利だが・・・

amazon linuxに限らず、無料証明書で有名なLet’s Encryptはたびたびエラーを吐く。

特にpython絡み(アップデートとか)でエラーを吐いてきて解消の仕方を忘れるので書いておく。

事象

rootユーザで証明書更新コマンドを打つと、以下のエラーが出る。

[root@tatoeba-web01]# ./letsencrypt-auto renew
Error: couldn't get currently installed version for /root/.local/share/letsencrypt/bin/letsencrypt:
Traceback (most recent call last):
  File "/root/.local/share/letsencrypt/bin/letsencrypt", line 7, in <module>
    from certbot.main import main
  File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/certbot/main.py", line 7, in <module>
    import zope.component
  File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/zope/component/__init__.py", line 16, in <module>
    from zope.interface import Interface
ImportError: No module named interface

前にpythonのバージョンが古くて、それはそれでLet's Encryptから「pythonアップデートしろよ」って言われて素直に従ったらこの仕打ち(笑)

ということでこのエラーが吐かれた場合は以下の方法で解消できる。

環境変数

# env | grep PYTHON_INSTALL_LAYOUT
PYTHON_INSTALL_LAYOUT=amzn

環境変数にamznがセットされているので、これをunsetする。

[root@tatoeba-web01]# unset PYTHON_INSTALL_LAYOUT

renewを実行

それぞれの環境に合わせて証明書更新コマンドを実行する。

[root@tatoeba-web01]# $LETSENCRYPT_HOME/letsencrypt-auto -v
もしくは
[root@tatoeba-web01]# $LETSENCRYPT_HOME/certbot-auto -v

僕の環境の場合はこれだけではエラーがまだ残った。

[root@tatoeba-web01]# ./letsencrypt-auto -v
Error: couldn't get currently installed version for /root/.local/share/letsencrypt/bin/letsencrypt:
Traceback (most recent call last):
  File "/root/.local/share/letsencrypt/bin/letsencrypt", line 7, in <module>
    from certbot.main import main
  File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/certbot/main.py", line 7, in <module>
    import zope.component
  File "/root/.local/share/letsencrypt/local/lib/python2.7/dist-packages/zope/component/__init__.py", line 16, in <module>
    from zope.interface import Interface
ImportError: No module named interface

上記エラーがまだ発生する場合は次の作業をする。

.localの削除

上記エラーに記述されている.localディレクトリを削除する。

[root@tatoeba-web01]# rm -rf /root/.local

これにて再度、証明書更新コマンドを実行する。

renewコマンド実行

[root@tatoeba-web01]# $LETSENCRYPT_HOME/letsencrypt-auto -v --debug
もしくは
[root@tatoeba-web01]# $LETSENCRYPT_HOME/certbot-auto -v --debug

今度はうまくいくはず。

すると、2点ほど質問されるので答えていく。

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: tatoeba-kimiga.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

正常終了すれば、証明書更新コマンドも打てるはずだ。

[root@tatoeba-web01]# ./letsencrypt-auto --force-renew

まとめ

Let's Encryptはpythonと深く関わってる感じなので、やっぱインフラエンジニアはpythonを理解してたほうがよさそうだ。

参考

https://blog.yskw.info/articles/326/