CentOS7のyumでのエラーを対処してみた。

CentOS7が2024年6月30日をもってサポート終了 (EOL) となりました。yum list updates を実行してもミラーサイトが閉鎖されたのか、軒並み [Errno 14] HTTP Error 404 – Not Found となります。


# yum list updates
 :
http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.tsukuba.wide.ad.jp/Linux/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://download.nus.edu.sg/mirror/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.iij.ad.jp/pub/linux/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
 :

ですので、過去のバージョンのパッケージが置かれている「http://vault.centos.org/」のサイトから取得するように、リポジトリファイルを書き換えることにしました。rootユーザーで作業します。

まずは、CentOSのバージョンを確認します。

# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

リポジトリのファイルは /etc/yum.repos.d 配下にあるので、ここにある CentOS-Base.repo ファイルを修正します。

# cd /etc/yum.repos.d
# cp -p CentOS-Base.repo CentOS-Base.repo.backup
# vi CentOS-Base.repo

mirrorlist= の行をコメントアウトし、新たに baseurl= の行を追加します。


[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/ ←★この行を追加する
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=kernel-* grubby-*

追加した行 baseurl=http://vault.centos.org/7.9.2009/os/$basearch/ の太字部分はCentOSのバージョンです。CentOS-Base.repo ファイルにはbaseブロック以外にも updates、extras、centosplus のブロックがあるので同様に書き換えます。

ファイルを保存したら、再度、yumコマンドを実行します。

先ほどの [Errno 14] HTTP Error 404 – Not Found は出なくなったのですが Not using downloaded というのが出ました。


# yum list updates
 :
centosplus                                                                                                             | 3.6 kB  00:00:00     
Not using downloaded centosplus/repomd.xml because it is older than what we have:
  Current   : Thu Mar  9 01:25:39 2023
  Downloaded: Fri Oct 30 05:03:00 2020
extras                                                                                                                 | 3.6 kB  00:00:00     
Not using downloaded extras/repomd.xml because it is older than what we have:
  Current   : Wed Apr  3 02:41:49 2024
  Downloaded: Fri Oct 30 05:03:00 2020
updates                                                                                                                | 3.6 kB  00:00:00     
Not using downloaded updates/repomd.xml because it is older than what we have:
  Current   : Sat Jun 22 01:30:50 2024
  Downloaded: Fri Oct 30 05:03:00 2020
 :

baseは大丈夫のようです。centosplus、extras、updates で出ています。これはダウンロードされる repomd.xml ファイルがキャッシュされているものより古い(キャッシュのほうが新しい)ために出ているようです。それにしても、ダウンロードされる repomd.xml が2020年だとかなり古い気がするのですが。。

これを解消するには yum clean all を実行するとのこと。いちおう、やってみました(というか、やってしまいました)。

# yum clean all

再度、yum list updates を実行すると、Not using downloaded は解消されました。ですので、yum update もあわせて実行しました。

# yum list updates
# yum update

yum clean all で新しい方のキャッシュのクリアが気にはなりますが、前回の yum update を2024年の6月下旬に実施したことを踏まえると、ほぼ最新の状態になっていると思いたい。そのため、yumコマンドが使えることを優先したと思えば、まあいいかと思います。本来であれば、CentOS7から他のOSに乗り換えるべきだと思いますが延命処置ということで。

certbot renew で Connection refused になってしまったので調べてみた。

Let's Encryptで証明書更新をしたのですが、Connection refused となってしまったので、原因を調べてみました。以下がエラーになったときのログです。ドメイン、IPは伏せています。


# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/web.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for web.example.com

Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems:
  Domain: web.example.com
  Type:   connection
  Detail: xxx.xxx.xxx.xxx: Fetching https://web.example.com/.well-known/acme-challenge/9109eVHrvSxOWX3e1EM94RDM42AGDBEk6pamz0Rm6qE: Connection refused

Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet.

Failed to renew certificate web.example.com with error: Some challenges have failed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
All simulated renewals failed. The following certificates could not be renewed:
  /etc/letsencrypt/live/web.example.com/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

certbotが https://web.example.com/.well-known 配下に一時ファイルを作成していて、それをLet's Encryptの認証局がダウンロードするようなのだけど、それができないらしい。certbot renew をして別画面を立ち上げて .well-known フォルダが作成されるかを確認したところ、フォルダは作成されているのはわかりました。ということは、外部からは .well-known フォルダがわかっていないらしい。

/var/log/letsencrypt/letsencrypt.log が出ているので、そちらを見てみたらポート80とポート443とではIPアドレスの名前解決方法が違うようです。ポート80ではIPv4を使い、ポート443ではIPv6を使っていることがわかりました。以下が、letsencrypt.log の抜粋です。


{
  "url": "http://web.example.com/.well-known/acme-challenge/9109eVHrvSxOWX3e1EM94RDM42AGDBEk6pamz0Rm6qE",
  "hostname": "web.example.com",
  "port": "80",
  "addressesResolved": [
    "xxx.xxx.xxx.xxx",
    "2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:1291"
   ],
   "addressUsed": "xxx.xxx.xxx.xxx"
},
{
  "url": "https://web.example.com/.well-known/acme-challenge/9109eVHrvSxOWX3e1EM94RDM42AGDBEk6pamz0Rm6qE",
  "hostname": "web.example.com",
  "port": "443",
  "addressesResolved": [
    "xxx.xxx.xxx.xxx",
    "2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:1291"
  ],
  "addressUsed": "2406:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:1291"
}

DNSの名前解決でIPv6を登録したのですが、どうやらそれが原因だったようです。なので、DNSのIPv6の名前解決を削除して改めて certbot renew をしてみました。


# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/web.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for web.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/web.example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

成功しました!

どうやらIPv6の名前解決に原因があったようでした。