CentOS6.xでcertbot-autoが動かなくなったので対応 (apache)

以下の複数の原因からCentOS6.xにインストールしたLetsEncryptのcertbot-autoコマンドが起動できず、SSL証明書の更新が出来なくなりました。新しいOSに引っ越すのが当然ですがとりあえずSSL証明書の更新はしないといけません。

調べてみると同じ条件でないことが多く、完全な解決策を見つけることが出来ませんでした。整理してみると、まず原因は以下の2つかと思います。

1. 2020秋にサポート切れでyumリポジトリが閉鎖され色々ダメになった
2. certbot-autoコマンドがpython3.5以上でないと動かなくなった

これを解決するため色々とみなさん試行錯誤されているようです。かくいう私もSSLの期限が迫っている数台のサーバーを何とかせねばならず焦っていました。調査したサーバーの主な環境は、

+ CentOS 6.10
+ Apache 2.2
+ https://certbot.eff.org のCentOS6用の今はない手順書で入れたcerbot-autoコマンド

certbot-autoのエラーから察するに、python3.5以上なら動きそうですが、例えcertbot-autoをアップデートしても現時点ではCentOS6で動作を認めていないようで、結局「このOSはサポートされないよ」というエラーとなります。ですので今でも汎用のLinux用にサポートしている pip で certbot をインストールする方法が唯一の対策かと思います。やるべきとこは、

1. なにはともあれ yum リポジトリを使えるようにする
2. SCL (Software Collections) を使って python3.6 を入れる
3. certbot-auto をやめ新たに certbot を pip でインストール

です。途中で色々苦労することが多いのはそのサーバーの環境が違うからなんですが、今回、複数（7台以上）の仮想サーバーで、CentOS 6.4, 6.7, 6.8, 6.9, 6.10 で検証しているのでかなり問題が網羅できていると思っています。

## 1. 使えなくなったリポジトリの変更

これはよくネットで書かれているようなsedコマンドでファイルを書き換えます。
手で書き換えても構いません。mirrorlist= の行をコメントにし、baseurl= のホスト名を「vault.centos.org」に変更しコメントを外すだけです。

```bash:
# sed -i -e "s/^mirrorlist=http:\/\/mirrorlist.centos.org/#mirrorlist=http:\/\/mirrorlist.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo
# sed -i -e "s/^#baseurl=http:\/\/mirror.centos.org/baseurl=http:\/\/vault.centos.org/g" /etc/yum.repos.d/CentOS-Base.repo
```

## 2. Python3.6 入れるため SCLリポジトリ追加

```bash:
# yum install centos-release-SCL
```

これもOSサポート終了のためそのままでは動かないのでリポジトリURL(baseurl)を変更します。
CentOS-Base.repo と同じホスト名の変更＆コメントを外し、mirrorlist= 行のコメントアウト。

```/etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
[centos-sclo-rh]
name=CentOS-6 - SCLo rh
baseurl=http://vault.centos.org/centos/6/sclo/$basearch/rh/
#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=6&repo=sclo-rh
・・・・
```

/etc/yum.repos.d/CentOS-SCLo-scl.repo が存在するなら CentOS-Base.repo と同じような修正が必要です。（他にも/etc/yum.repos.d/*.repoファイルがあればチェックが必要かも）

```bash:
# yum clean all
```

## 3. Python3.6 インストール

SCL専用のパッケージ「rh-python36」をインストールしシェルで使えるように有効化します。

```bash:
# yum install rh-python36
# scl enable rh-python36 bash
```

ここで不運にも

```
エラー: Cannot retrieve metalink for repository: epel.
```

と出てしまった場合、SSLプロトコルの問題の可能性があり、

```/etc/yum.repos.d/epel.repo
mirrorlist=http://mirrors.fedoraproject.org・・・
```

epel.repo 内のすべて https を http に変更するとよい。

## 4. python3 コマンドとしてシンボリックリンク

```bash:
# cd /usr/bin
# unlink python3
# ln -s /opt/rh/rh-python36/root/usr/bin/python3 python3
# python3 --version
```

## 5. 本題である certbot コマンドをインストール

Pythonの仮想実行環境venvを使い、pipでcertbotをインストールします。
httpサーバーにApache2を使っているので同時に apache プラグインもインストールします。

```bash:
# python3 -m venv /opt/certbot/
# /opt/certbot/bin/pip install --upgrade pip
# /opt/certbot/bin/pip install certbot certbot-apache
# ln -s /opt/certbot/bin/certbot /usr/bin/certbot
# certbot --version
```

## 6. 証明書自動更新（cron）の修正

私の場合 cron の設定は /etc/cron.d/letsencrypt に書いていましたのでこれを編集します。certbot-auto をそのまま certbot に置き換えるだけです。（数字 の N は任意ですね）

```/etc/cron.d/letsencrypt
00 N * * N root certbot renew --post-hook "service httpd restart"
```

## これでしばらくは使えそうでは？

証明書のパスなど構造は certbot-auto と同じなのでこのまま継続して使用出来ます。

```bash:
# certbot certificates
```

もちろんSSL証明書の新規所得も可能です。

```bash:
# certbot --apache
```

サーバー構築は比較的古めのCentOSを使ってきたツケがここに来てまわってきた感じで、SSLがどんどん期限切れになっていく様は時限爆弾のようです。

一部は新しいサーバーを立て引っ越してしまいましたがそれも気が遠くなるのでこの対策で少し楽になりました。放置した自分が悪いのですが、昔のシステムのメンテはモチベーション上がりませんよね。新しいサーバーに新しいシステム入れるのは楽しいんだけど。
これからはUbuntu20.04を使っていきます。