8月1日にかえでBlogで使用しているSSL証明書の有効期限が切れてしまい、1日中正常に閲覧できない事象が発生いたしました。
事象
SSL証明書はLet's Encryptを使用しており、SSL証明書の有効期間が3ヵ月と短いことから自動的に証明書更新を行うようにバッチ処理を作っていたのですが、それが正常に実行できておらず、証明書有効期限が切れてしまっていました。
原因
urllib3エラーになってる
バッチ処理のログを確認してみると以下のようなエラーとなっており、実行できていなかったようです。
+ certbot certonly --webroot --csr ***.csr --cert-path ***.crt --chain-path ***.pem -m ***@****.*** --renew-by-default --agree-tos -w *** -d kaede.jp --expand
Traceback (most recent call last):
File "/usr/bin/certbot", line 9, in <module>
load_entry_point('certbot==0.34.2', '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 20, in <module>
from certbot import client
File "/usr/lib/python2.7/site-packages/certbot/client.py", line 14, in <module>
from acme import client as acme_client
File "/usr/lib/python2.7/site-packages/acme/client.py", line 37, in <module>
requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3() # type: ignore
File "/root/.local/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 118, in inject_into_urllib3
_validate_dependencies_met()
File "/root/.local/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 155, in _validate_dependencies_met
raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
pythonの urllib3 エラーが発生しておりました。
urllib3はSSL関連で使用されるライブラリなので、どこかで最低限必要なバージョンが上がったんでしょうか・・・
epelリポジトリでのcertbotは古い
かえでBlogではepelリポジトリに存在するcertbotをインストールしていたのですが、そのcertbotはpython2.7で動作します。
python2.7は2020年1月までサポートはありますので、対応はしているのでしょうが、どこかのバージョンで必要な urllib3 のバージョンが上がったと思われます。
対応
CentOS7にインストールされているPythonは2.7.5であり、SSLモジュールが古いため、そのまま必要とされている urllib3 をインストールすることができないです。
単独でurllib3をアップデートすることも可能ですが、pyOpensslのアップデートが必要になりpyOpensslをアップデートしようとするとOpenSSLを別途インストールしないといけない・・・などいろいろと手間がかかるのでpython3.xに上げたほうが手っ取り早いです。
なので
・epelリポジトリのcertbotをアンインストール
・python3.x+pipをインストールする
・pipでcertbotをインストールする
の順に実行することにした。
## 既にcertbotをインストールしているので削除
yum remove certbot
## epelリポジトリにpython3.6があるのでそれとpipをインストール
yum install python36 python36-pip
## pipのバージョンを確認
pip --version
# pip 19.2.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
# ※上記なっていない場合はpip3.6とかになっている場合あり
## pipで一度upgrade実行
pip install --upgrade pip
## certbotのインストール
pip install certbot
pipでcertbotを入れると「/usr/local/bin/certbot」にもインストールされるのでそのまま使用可能になります。
AWS CLI Toolも同様
AWSで配布しているCLIツールもあるバージョンからS3にやりとりするだけで毎回urllib3に関する大量Warningが発生する。(2.7.9未満はSNIサポートされていない旨が出る)
今後、pythonで使っているモジュール関連が3.x以上になっていくと思われるので、特に支障がないならPython3.xにあげたほうがいいと思います。