すべてのデプロイガイド デプロイ

curl、Git、Python、Node.jsのSSL証明書エラーの修正

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がツールのトラストストアに含まれていません。

関連記事

SSL と証明書 2026-05-07
証明書チェーンの仕組み
ブラウザがルートCAから中間CAを経てあなたの証明書までの証明書チェーンを通じてSSL証明書を検証する仕組みを解説。チェーンの順序の重要性と「証明書が信頼されていない」エラーの修正方法も紹介します。
SSL と証明書 2026-05-08
自己署名 vs CA署名SSL証明書
自己署名証明書はブラウザ警告を引き起こします。CA署名証明書は自動的に信頼されます。それぞれが適切な場面、作成方法、無料CA証明書により本番環境では自己署名が不要になった理由を解説します。
デプロイ 2026-05-08
ローカル開発用HTTPS:localhostのSSL証明書
mkcertで信頼されたlocalhostのHTTPSを設定。ブラウザ警告なし。mkcertのセットアップ、自己署名証明書、Let's Encryptがlocalhostの証明書を発行できない理由を解説します。
SSL と証明書 2026-05-08
OpenSSLコマンド チートシート
最も一般的なOpenSSLコマンドのクイックリファレンス:証明書の有効期限確認、チェーン検証、鍵生成、フォーマット変換、TLS接続のデバッグ。
ブラウザで無料 SSL 証明書を取得
インストール不要、アカウント不要。秘密鍵は常にデバイスに残ります。
証明書を取得