SSL certificate problem: unable to get local issuer certificate(またはその派生エラー)は、開発で最もよく遭遇する問題の1つです。ツールがサーバーの証明書チェーンを検証できないことを意味します。通常、システムのCA ルート証明書が古いか、見つからないことが原因です。
このガイドでは、セキュリティを無効にする-k / --insecureの回避策ではなく、適切な修正方法を解説します。
根本原因
ツールはCAバンドル(信頼されたルート証明書を含むファイル)に対してSSL証明書を検証します。このバンドルが古い、見つからない、またはサーバーのチェーンが不完全な場合、検証が失敗します。
ツール → 「この証明書は信頼するCAが署名しているか?」
CAバンドル → 「そのCAのルート証明書を持っていません」
→ ERROR: unable to get local issuer certificate
curl
エラー
curl: (60) SSL certificate problem: unable to get local issuer certificate
修正1: CA証明書を更新する(正しい修正方法)
# Debian/Ubuntu
sudo apt update && sudo apt install ca-certificates
sudo update-ca-certificates
# CentOS/RHEL
sudo yum update ca-certificates
# macOS (Homebrew curl)
brew install ca-certificates
修正2: CAバンドルのパスを指定する
curl --cacert /etc/ssl/certs/ca-certificates.crt https://example.com
修正3: 環境変数を設定する
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
これはやらないでください(テスト時以外)
curl -k https://example.com # すべての証明書検証を無効にします
Git
エラー
fatal: unable to access 'https://...': SSL certificate problem: unable to get local issuer certificate
修正1: CA証明書を更新する(curlと同じ)
sudo apt update && sudo apt install ca-certificates
修正2: 正しいCAバンドルをGitに指定する
git config --global http.sslCAInfo /etc/ssl/certs/ca-certificates.crt
修正3: Windows(Git for Windows)の場合
Git for Windowsは独自のCA証明書をバンドルしています。Gitを最新バージョンに更新するか、以下を実行してください:
git config --global http.sslBackend schannel
これにより、バンドルされたCA証明書の代わりにWindowsの組み込み証明書ストアを使用するようGitに指示します。
本番環境ではこれをやらないでください
git config --global http.sslVerify false # GitのすべてのSSL検証を無効にします
Python(requests / pip)
エラー(requests)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
エラー(pip)
pip install ... Could not fetch URL https://...: connection error: [SSL: CERTIFICATE_VERIFY_FAILED]
修正1: certifiを更新する(PythonのCAバンドル)
pip install --upgrade certifi
Pythonのrequestsライブラリは、システムストアではなくcertifiパッケージのCA証明書を使用します。
修正2: システムのCAバンドルを指定する
import requests
response = requests.get('https://example.com', verify='/etc/ssl/certs/ca-certificates.crt')
または環境変数で:
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
修正3: macOS Python(よくある問題)
macOSのPythonは、インストール後に証明書ストアが空になっていることがよくあります。以下を実行してください:
# Pythonのインストール場所を確認
python3 -c "import ssl; print(ssl.get_default_verify_paths())"
# 証明書をインストール(python.orgからのmacOS Python)
/Applications/Python\ 3.x/Install\ Certificates.command
pip専用の修正
pip install --upgrade pip
pip config set global.cert /etc/ssl/certs/ca-certificates.crt
Node.js
エラー
Error: unable to get local issuer certificate
code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY'
修正1: NODE_EXTRA_CA_CERTSを設定する
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
これにより、Node.jsの組み込みバンドルを置き換えることなく、追加のCAが追加されます。
修正2: 開発環境での自己署名証明書の場合
// 開発環境専用 — 特定のCAを追加
const https = require('https');
const fs = require('fs');
const agent = new https.Agent({
ca: fs.readFileSync('/path/to/custom-ca.pem'),
});
fetch('https://internal-service.local', { agent });
本番環境ではこれをやらないでください
export NODE_TLS_REJECT_UNAUTHORIZED=0 # すべてのSSL検証を無効にします
企業プロキシ/エンタープライズ環境
多くの企業ネットワークでは、内部CAでトラフィックを再署名するTLSインスペクションプロキシを使用しています。ツールはこの内部CAを信頼していません。
修正: IT部門から企業CA証明書を入手し、追加してください:
# システム全体(Debian/Ubuntu)
sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# Python
export REQUESTS_CA_BUNDLE=/path/to/corporate-ca-bundle.pem
# Node.js
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem
# Git
git config --global http.sslCAInfo /path/to/corporate-ca-bundle.pem
Dockerコンテナ
Dockerイメージには古いCAバンドルが含まれていることがよくあります。修正方法:
# Debianベース
RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates
# Alpine
RUN apk add --no-cache ca-certificates
クイック診断
# OpenSSLでSSL接続が動作するかテスト
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | grep "Verify return code"
# "0 (ok)" = チェーンは正常、ツールのCAバンドルが問題
# "21 (unable to verify)" = サーバーのチェーンが不完全
# システムが使用するCAバンドルを確認
python3 -c "import certifi; print(certifi.where())"
curl-config --ca 2>/dev/null || echo "Check /etc/ssl/certs/"
よくある質問
ブラウザでは動作するのにcurl/Pythonでは動作しないのはなぜですか?
ブラウザは独自のCAストアを管理しています(ブラウザの更新とともに更新)。CLIツールはシステムのCAバンドルまたは独自のもの(Pythonはcertifi、Git for Windowsは独自バンドル)を使用します。システムバンドルが古い場合、CLIツールは失敗しますがブラウザは正常に動作します。
SSL検証を無効にしても安全ですか?
簡単なテスト目的:はい、サーバーのIDを検証していないことを理解していれば。本番コードやCI/CD:絶対にやらないでください。検証を無効にすると、中間者攻撃に対して脆弱になります。常に根本原因を修正してください(CAバンドルの更新またはサーバーのチェーンの修正)。
サーバーの証明書は正常なのにエラーが出る場合
ツールがトラフィックを再署名するプロキシを経由しているか確認してください。企業ネットワーク、一部のVPN、アンチウイルスソフトウェアがこれを行います。プロキシのCAがツールのトラストストアに含まれていません。