古いRaspbian(Debian 8 Jessie等)でSSL/TLS接続を行おうとすると、以下のようなエラーが発生することがあります:
SSL certificate problem: unable to get local issuer certificate
certificate verify failed
SSL: CERTIFICATE_VERIFY_FAILED
これは、システムにインストールされているCA証明書バンドルが古くなっているためです。
従来の解決法の問題点
通常は sudo apt update && sudo apt install ca-certificates
で解決しますが、古いRaspbianでは以下の問題が発生します:
sudo apt install ca-certificates
# => ca-certificates : Depends: openssl (>= 1.1.1) but 1.0.1t-1+deb8u6 is to be installed
古いOpenSSL(1.0.1t)が新しいca-certificatesパッケージの要求(OpenSSL 1.1.1以上)を満たせないため、パッケージ管理での更新ができません。
また、sudo apt update
しても、すでにアップデートサーバーが変わっていたりしてエラーになります。
解決方法:CA証明書バンドルのみを手動更新
システム全体を更新せずに、CA証明書のみを最新版に置き換える方法です。
手順
# 1. 現在のCA証明書をバックアップ
sudo cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.backup
# 2. Mozilla/curl.seから最新のCA証明書バンドルをダウンロード
sudo wget -O /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem
# 3. 適切な権限を設定
sudo chmod 644 /etc/ssl/certs/ca-certificates.crt
# 4. ハッシュリンクを再構築(古いOpenSSL対応)
sudo c_rehash /etc/ssl/certs/
ハッシュリンクの再構築をしないとうまく読み込むことができません!
動作確認
# SSL接続テスト
curl -I https://www.google.com
# または
openssl s_client -connect google.com:443 -CAfile /etc/ssl/certs/ca-certificates.crt
この方法のメリット
- システム全体を更新する必要がない - 古いRaspbianをそのまま使用可能
- 依存関係の問題を回避 - パッケージ管理の制約を受けない
- 最新のCA証明書を取得 - curl.seのMozilla CA証明書バンドルは定期的に更新される
- 安全性を保持 - 信頼できるソース(Mozilla)からの証明書を使用
補足
CA証明書バンドルの出典
使用している https://curl.se/ca/cacert.pem
は、MozillaのCA証明書プログラムから抽出された信頼できるCA証明書のコレクションです。
ぶつぶつ
古いRaspbianでSSLエラーが発生した場合、curlコマンドに-k
オプションをつけたりしていました。
このようにすることで、システム全体を更新せずに定期的にCA証明書のみを更新するようにできました。
おまけ
どの程度需要があるかわかりませんが、goで一連のコマンドを実行するツールを作りました。参考まで。