Let's Encrypt の certbotのエラー

Let's Encryptで証明書を発行しようとした時にハマったのでメモします。

証明書を発行するために、ドメインの認証をする必要があるのですが、いまは便利なものでcertbotという仕組みが用意されているようです。 検索すれば情報がたくさん出てきます。

さっそく私のCent7の環境でもcertbotで証明書を発行するべく、試してみましたが、ImportError: No module named contrib.pyopensslというエラーが出てしまいました。。。

[root@test foxtrot]# certbot certonly --webroot -w ~/cert -d example.jp
Traceback (most recent call last):
  File "/bin/certbot", line 9, in <module>
    load_entry_point('certbot==0.19.0', 'console_scripts', 'certbot')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/certbot/main.py", line 19, in <module>
    from certbot import client
  File "/usr/lib/python2.7/site-packages/certbot/client.py", line 11, in <module>
    from acme import client as acme_client
  File "/usr/lib/python2.7/site-packages/acme/client.py", line 33, in <module>
    import urllib3.contrib.pyopenssl  # pylint: disable=import-error
ImportError: No module named contrib.pyopenssl
[root@test foxtrot]#

このエラーは、以下のようなissueを参考にしました。

github.com github.com

何個か書かれていた手順をためしたり、パッケージをアップデートすることによって解決できました。

### pyOpenSSLのアップデート
[root@test foxtrot]# rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:pyOpenSSL-0.15.1-1.el7           ################################# [ 50%]
整理中 / 削除中...
   2:pyOpenSSL-0.13.1-3.el7           ################################# [100%]
[root@test foxtrot]#

### シンボリックリンクの作成
[root@test foxtrot]# ln -s /usr/lib/python2.7/site-packages/OpenSSL /usr/lib/python2.7/site-packages/pyOpenSSL
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# ls -ld /usr/lib/python2.7/site-packages/pyOpenSSL
lrwxrwxrwx 1 root root 40 11月 19 12:13 /usr/lib/python2.7/site-packages/pyOpenSSL -> /usr/lib/python2.7/site-packages/OpenSSL
[root@test foxtrot]#

### python-urllibのアップデート
[root@test foxtrot]# yum update python-urllib
...
[root@test foxtrot]# rpm -qa | grep urllib
python-urllib3-1.10.2-3.el7.noarch
[root@test foxtrot]#

再度発行を試します。 この度は、調子よくメールアドレスとか聞いてきたのですが、また別のエラーが。。。 なんかのパッケージにバグがあるっぽいなと。。。

...
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
An unexpected error occurred:
TypeError: cannot concatenate 'str' and 'tuple' objects
Please see the logfiles in /var/log/letsencrypt for more details.

どうしようかなーと考えて、再度検索し、結局別のcertbotをもってくることで解決しました。 参考にしたのは、gitのcertbotを持ってくる手順です。

qiita.com

これでなんとかかんとか証明書を発行することができました。 次は証明書の更新の自動化とかどうしようかなぁと考えています。