SSL certificate problem: unable to get local issuer certificate というエラーが出て接続できない」Linuxのシステムトラストストアには、公的な認証局(Let's Encryptやグローバルサインなど)の証明書があらかじめ登録されていますが、社内CA・プロキシが発行した証明書・自己署名証明書は含まれていません。このため、そうした証明書を使ったサーバーへのHTTPS接続時にエラーが発生するのは正常な動作であり、解決するにはLinuxのトラストストアにCA証明書を追加する必要があります。
この記事では、RHEL 9 / Rocky Linux / AlmaLinux(
update-ca-trustコマンド)とUbuntu 24.04 / Debian系(update-ca-certificatesコマンド)それぞれでカスタムCA証明書を追加する手順を解説します。証明書フォーマットの確認・変換、追加後のopenssl verify確認、JavaやPythonで別途設定が必要なケースまでカバーします。動作確認環境:RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS
この記事のポイント
・RHEL系はupdate-ca-trust、Ubuntu系はupdate-ca-certificatesで追加する
・証明書はPEM形式(BEGIN CERTIFICATE行)が前提、DERは変換が必要
・追加後はopenssl verify / curlで必ず動作確認する
・JavaアプリはOSトラストストアとは独立したkeytoolの設定が別途必要
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜLinuxは知らないCA証明書を拒否するのか
LinuxのHTTPSクライアント(curl・wget・Python requestsなど)は、接続先サーバーの証明書が「信頼できる認証局(CA)に署名されているか」をシステムのトラストストアで検証します。トラストストアは次のディレクトリにまとめられた集約ファイルが実体です。・RHEL/Rocky Linux/AlmaLinux:
/etc/pki/tls/certs/ca-bundle.crt(update-ca-trustが生成する集約ファイル)・Ubuntu/Debian:
/etc/ssl/certs/ca-certificates.crt(update-ca-certificatesが生成する集約ファイル)curlで社内サーバーにアクセスすると、次のようなエラーが出ます。
$ curl -v https://internal-server.example.com/ * Trying 192.168.1.50:443... * Connected to internal-server.example.com (192.168.1.50) port 443 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (OUT), TLS alert, unknown CA (560): * SSL certificate problem: unable to get local issuer certificate * Closing connection curl: (60) SSL certificate problem: unable to get local issuer certificate
unknown CA」がエラーの本質です。証明書の発行元CAがトラストストアにないため検証に失敗しています。-kオプション(証明書検証を無効にする)で回避する方法を使う場面もありますが、本番環境での常用は中間者攻撃のリスクがあり、正しくCA証明書を登録するのが安全な解決策です。RHEL/Rocky Linux/AlmaLinuxでカスタムCA証明書を追加する手順
RHEL系はca-certificatesパッケージが提供するupdate-ca-trustコマンドでトラストストアを管理します。RHEL 7以降で標準搭載されており、追加・削除のたびに1コマンドで集約ファイルが再生成されます。1. 証明書がPEM形式かどうかを確認する
update-ca-trustが読み込めるのはPEM形式(Base64エンコード)のみです。DER形式(バイナリ)のままコピーしても黙って無視されます。まず形式を確認します。# PEM形式かどうかを確認する("BEGIN CERTIFICATE" が表示されれば OK) $ head -1 myca.crt -----BEGIN CERTIFICATE----- # openssl x509 でも詳細を確認できる $ openssl x509 -in myca.crt -noout -subject -issuer -dates subject=C=JP, O=Example Corp, CN=Example Internal CA issuer=C=JP, O=Example Corp, CN=Example Internal CA notBefore=Jan 1 00:00:00 2024 GMT notAfter=Dec 31 23:59:59 2034 GMT
-----BEGIN CERTIFICATE----- であればPEM形式です。ファイルの先頭がバイナリ(文字化け)のように見える場合はDER形式なので、次のコマンドでPEMに変換してください。# DER形式をPEM形式に変換する $ openssl x509 -in myca.der -inform DER -out myca.pem -outform PEM # 変換結果を確認する $ head -1 myca.pem -----BEGIN CERTIFICATE-----
2. アンカーディレクトリへ証明書を配置する
RHEL系でカスタムCA証明書を追加する配置先は/etc/pki/ca-trust/source/anchors/ です。ファイル名は任意ですが、.pem 拡張子が推奨です(.crt でも動作します)。# アンカーディレクトリへ証明書をコピーする $ sudo cp myca.pem /etc/pki/ca-trust/source/anchors/ # コピーを確認する $ ls -la /etc/pki/ca-trust/source/anchors/ total 12 drwxr-xr-x. 2 root root 22 Oct 11 11:05 . drwxr-xr-x. 8 root root 156 Sep 1 09:00 .. -rw-r--r--. 1 root root 2143 Oct 11 11:05 myca.pem
3. update-ca-trust extractでトラストストアを更新する
証明書を配置したらupdate-ca-trust extract を実行してトラストストアに反映させます。# トラストストアを更新する(正常終了時は出力なし) $ sudo update-ca-trust extract # trust コマンドで登録済みの証明書一覧を確認する $ trust list | grep -A3 "Example Internal CA" pkcs11:id=%4A%B1%2D%8C%9E%F3%44%A7%BB%CC%1D%E4%F5%96%78%20;type=cert type: certificate label: Example Internal CA trust: anchor
trust: anchor」と表示されれば登録成功です。trust listコマンドが見つからない場合は sudo dnf install p11-kit-trust でインストールしてください。Ubuntu/Debian系でカスタムCA証明書を追加する手順
Ubuntu/DebianはUpdate-ca-certificatesコマンドでトラストストアを管理します。ca-certificatesパッケージが標準でインストールされており、同様の手順で追加できます。1. 証明書ファイルを.crt拡張子で準備する
Ubuntu/DebianでもPEM形式が前提ですが、ファイル拡張子が .crt でなければなりません。update-ca-certificatesは .pem や .cert などその他の拡張子を無視します。# 拡張子が .pem の場合は .crt にコピーする $ cp myca.pem myca.crt # PEM形式であることを確認する $ head -1 myca.crt -----BEGIN CERTIFICATE-----
2. /usr/local/share/ca-certificates/へ配置する
ユーザーが追加するCA証明書の配置先は/usr/local/share/ca-certificates/ です。OS標準のCA証明書が格納されている /usr/share/ca-certificates/ は直接編集しません。# 証明書をコピーする $ sudo cp myca.crt /usr/local/share/ca-certificates/ $ ls -la /usr/local/share/ca-certificates/ total 12 drwxr-xr-x 2 root root 4096 Oct 11 12:00 . drwxr-xr-x 3 root root 4096 Sep 1 09:00 .. -rw-r--r-- 1 root root 2143 Oct 11 12:00 myca.crt
3. update-ca-certificatesを実行する
# トラストストアを更新する $ sudo update-ca-certificates Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done.
/etc/ssl/certs/に新しいシンボリックリンクが追加されています。# 追加されたシンボリックリンクを確認する $ ls -la /etc/ssl/certs/ | grep myca lrwxrwxrwx 1 root root 40 Oct 11 12:00 myca.pem -> /usr/local/share/ca-certificates/myca.crt
追加後の動作確認(openssl verify / curl)
CA証明書を追加したら、必ず動作確認を行います。openssl verifyで証明書チェーンを確認する
サーバーの証明書ファイルがあれば
openssl verify コマンドで検証できます。# サーバー証明書がシステムのトラストストアで検証できるか確認する $ openssl verify /path/to/server.crt /path/to/server.crt: OK # RHEL系:集約ファイルを明示的に指定して確認する $ openssl verify -CAfile /etc/pki/tls/certs/ca-bundle.crt /path/to/server.crt /path/to/server.crt: OK
curlで実際のHTTPS接続を確認する
実際のHTTPS接続が通るか確認します。接続先のポートが開いているかどうかも合わせて確認するには、Linux ポート確認の全コマンドでssやlsofを使った手順を参照してください。
# curlで動作確認する(証明書エラーが出なければ OK) $ curl -LI https://internal-server.example.com/ HTTP/2 200 server: nginx/1.24.0 content-type: text/html; charset=UTF-8
よくあるトラブルシュートと対処
1. 追加後もcurlがSSLエラーを出す
update-ca-trust / update-ca-certificates実行後もエラーが続く場合、以下の手順で切り分けます。ステップ1:証明書がPEM形式か再確認する
# fileコマンドで形式を確認する $ file /etc/pki/ca-trust/source/anchors/myca.pem /etc/pki/ca-trust/source/anchors/myca.pem: PEM certificate # "PEM certificate" と表示されれば OK # "data" と出たら DER 形式のまま → PEM に変換が必要
# CA証明書を直接指定すると通る場合 → トラストストアへの登録が未反映 $ curl --cacert /tmp/myca.pem https://internal-server.example.com/
サーバー証明書がルートCAではなく中間CAで署名されている場合、中間CAの証明書も追加が必要です。
openssl s_clientでサーバーが送ってくる証明書チェーンを確認します。# サーバーが送ってくる証明書チェーンを確認する $ openssl s_client -connect internal-server.example.com:443 -showcerts 2>/dev/null | grep -E "(subject|issuer)=" subject=C=JP, O=Example Corp, CN=internal-server.example.com issuer=C=JP, O=Example Corp, CN=Example Intermediate CA
2. JavaアプリケーションがHTTPS接続できない
JavaはOSのトラストストアとは独立した「Java KeyStore(JKS)」を使います。OSにCA証明書を追加しても、JVM側には反映されないため、keytoolコマンドで別途追加が必要です。# Java KeyStoreにCA証明書を追加する(デフォルトパスワードは changeit) $ sudo keytool -import -trustcacerts \ -keystore $JAVA_HOME/lib/security/cacerts \ -storepass changeit \ -alias myca \ -file myca.pem Certificate was added to keystore # 追加を確認する $ keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep myca myca, Oct 11, 2026, trustedCertEntry,
3. Pythonのrequestsが証明書エラーになる
Pythonのrequestsライブラリはデフォルトでcertifiパッケージのトラストストアを参照し、OSのトラストストアを使わない場合があります。環境変数REQUESTS_CA_BUNDLEでシステムトラストストアを参照させることで解決します。# RHEL系の場合 $ export REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt # Ubuntu系の場合 $ export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # 永続化する場合は /etc/environment または ~/.bashrc に追記する $ echo 'REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt' | sudo tee -a /etc/environment
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 証明書がPEM形式か確認する | head -1 cert.crt(BEGIN CERTIFICATEが表示されればOK) |
| DER形式をPEM形式に変換する | openssl x509 -in cert.der -inform DER -out cert.pem -outform PEM |
| RHEL系:CA証明書を追加する | sudo cp myca.pem /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust extract |
| Ubuntu系:CA証明書を追加する(.crt必須) | sudo cp myca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates |
| 追加した証明書を確認する(RHEL) | trust list | grep -A3 "CA名" |
| 証明書チェーンを検証する | openssl verify /path/to/server.crt |
| JavaのKeyStoreに追加する | keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -alias myca -file myca.pem |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、2日間のハンズオンセミナーを開催しています。SSL/TLS証明書管理・SELinux・firewalldを含むセキュリティ設定を実機操作で習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:Linuxのヒュージページ設定|THPを無効化してデータベースサーバーの性能劣化を防ぐ方法
- この記事の属するカテゴリ:Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます