技術・開発

【Rocky Linux】MariaDBアップデート時の証明書エラー(Curl error 60)原因と回避方法

2022年3月30日

Rocky Linux環境でMariaDBをアップデート(dnf update)しようとしたところ、ミラーサイトのSSL証明書エラーで弾かれてしまう現象に遭遇しました。

# dnf update
MariaDB                                                                                                        0.0  B/s |   0  B     00:00    
Errors during downloading metadata for repository 'mariadb':
  - Curl error (60): Peer certificate cannot be authenticated with given CA certificates for [https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/10.5/centos8-amd64/repodata/repomd.xml](https://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/yum/10.5/centos8-amd64/repodata/repomd.xml) [SSL certificate problem: unable to get local issuer certificate]
エラー: repo 'mariadb' のメタデータのダウンロードに失敗しました : Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

「unable to get local issuer certificate」と出ているため、認証局(CA)周りのエラーで落ちているようです。備忘録として、原因調査とクライアント側での回避手順をまとめます。


1. エラー原因の調査

curlコマンドでの切り分け

まずは curl で該当URLを叩いて状況を確認してみます。

# curl --head [https://ftp.yz.yamagata-u.ac.jp](https://ftp.yz.yamagata-u.ac.jp)
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: [https://curl.haxx.se/docs/sslcerts.html](https://curl.haxx.se/docs/sslcerts.html)

# --insecure オプション(証明書検証をスキップ)を付けると通る
# curl --head [https://ftp.yz.yamagata-u.ac.jp](https://ftp.yz.yamagata-u.ac.jp) --insecure
HTTP/2 200 
last-modified: Sat, 01 Jan 2022 04:48:06 GMT
etag: "610-5d47dfe4ccd80"
accept-ranges: bytes
content-length: 1552
content-type: text/html
date: Tue, 29 Mar 2022 16:02:39 GMT
server: Apache/2.4.52 (Unix) OpenSSL/1.1.1n

やはり証明書エラーが起きています。Rocky Linux側に必要な認証局の証明書が入っていないのでしょうか。

ブラウザで証明書と認証局を確認

対象のURLをブラウザで開き、証明書チェーンを確認してみました。

発行者は 「NII Open Domain CA - G7 RSA」 という国立情報学研究所のオープンドメイン認証局とのこと。(こんな認証局があるんですね!) そして、ルート証明書は「SECOM Trust Systems CO.,LTD.」となっています。Windows環境などでは、この中間証明書もデフォルトでよしなに処理してくれているようです。

OpenSSLでサーバーから送られてくる証明書を確認

本当にサーバー側から正しい証明書チェーンが送られてきているのか、openssl s_client コマンドで確認してみます。

# openssl s_client -connect ftp.yz.yamagata-u.ac.jp:443 -showcerts
CONNECTED(00000003)
depth=0 C = JP, ST = Yamagata, L = Yamagata, O = Yamagata University, OU = Networking and Computing Service Center, CN = ftp.yz.yamagata-u.ac.jp
verify error:num=20:unable to get local issuer certificate
verify return:1
---
Certificate chain
 0 s:C = JP, ST = Yamagata, L = Yamagata, O = Yamagata University, OU = Networking and Computing Service Center, CN = ftp.yz.yamagata-u.ac.jp
   i:C = JP, O = "SECOM Trust Systems CO.,LTD.", CN = NII Open Domain CA - G7 RSA
-----BEGIN CERTIFICATE-----
MIIH4zCCBsugAwIBAgIQRuJJgVA2jvHPPDRz5XhueDANBgkqhkiG9w0BAQsFADBa
・
・
・

出力結果を確認すると、サーバーから中間CAの証明書が送られてきていません。 どうやら、サーバー側(ミラーサイト)の設定で中間証明書を結合し忘れている(送信し忘れている)のが根本原因のようです。

しばらく待てばサーバー側で修正対応してくれそうですが、今回は自分のRocky Linux側(クライアント側)に中間証明書を手動インストールして信頼させることで、サクッと回避することにします。


2. クライアント側での対応方法(回避手順)

Rocky Linuxの証明書バンドルファイル(tls-ca-bundle.pem)を確認したところ、大元のSECOMのルート証明書(Security Communication RootCA2)は入っていました。 つまり、足りていない中間証明書(NII Open Domain CA - G7 RSA)を追加してあげれば通信できるようになります。

バックアップの取得

念のため、現在の証明書バンドルファイルのバックアップを取っておきます。

cd /etc/pki/ca-trust/extracted/pem
cp tls-ca-bundle.pem tls-ca-bundle.pem_20220330

# 差分がないことを確認
diff tls-ca-bundle.pem tls-ca-bundle.pem_20220330

中間証明書のダウンロードとインストール

国立情報学研究所のリポジトリから直接中間証明書(.cer)をダウンロードし、トラストアンカー用のディレクトリに配置してシステムを更新します。

cd /etc/pki/ca-trust/source/anchors/

# 中間証明書をダウンロード
wget [https://repo1.secomtrust.net/sppca/nii/odca4/pem/nii-odca4g7rsa.cer](https://repo1.secomtrust.net/sppca/nii/odca4/pem/nii-odca4g7rsa.cer)

# update-ca-trust コマンドで証明書リストを更新
update-ca-trust extract

# diffで差分を確認し、証明書が追加されていることを確認
cd /etc/pki/ca-trust/extracted/pem
diff tls-ca-bundle.pem tls-ca-bundle.pem_20220330
1,31d0
< # NII Open Domain CA - G7 RSA
< -----BEGIN CERTIFICATE-----
< MIIE8DCCA9igAwIBAgIQIrmxhYemmUO17DaPTK9o9zANBgkqhkiG9w0BAQsFADBd
・
・

3. 動作確認

curlでの確認

再度 curl を実行してみます。

curl --head [https://ftp.yz.yamagata-u.ac.jp](https://ftp.yz.yamagata-u.ac.jp) 
HTTP/2 200 
last-modified: Sat, 01 Jan 2022 04:48:06 GMT
etag: "610-5d47dfe4ccd80"
accept-ranges: bytes
# (以下略)

無事、証明書エラーが出ずに通信できるようになりました!

dnf update の確認

本命のMariaDBアップデート処理を実行します。

# dnf update
MariaDB                                                                                                        3.6 MB/s | 601 kB     00:00    
Remi's RPM repository for Enterprise Linux 8 - x86_64                                                          1.0 MB/s | 4.0 MB     00:03    
# (中略)
依存関係が解決しました。
行うべきことはありません。
完了しました!

こちらもメタデータのダウンロードに成功し、正常に処理が通るようになりました。


補足:追加した中間証明書を削除したい場合

サーバー側の設定が修正され、手動で入れた中間証明書が不要になった場合は、以下のコマンドで元に戻すことができます。

# ダウンロードした中間証明書を削除
rm /etc/pki/ca-trust/source/anchors/nii-odca4g7rsa.cer

# 証明書リストを再更新
update-ca-trust extract

雑感

ちなみに、同じドメインのトップページ( https://www.yamagata-u.ac.jp/jp/ )をブラウザで確認したところ、そちらは正しく中間証明書も送信されていました。今回はミラー用のサブドメイン側の設定漏れだったようですね。 いずれにせよ、サーバー側の証明書不備をクライアント側でカバーする良いナレッジになりました!

-技術・開発
-, , , , , , ,