LinuxにカスタムCA証明書を追加する方法|update-ca-trustとupdate-ca-certificatesの実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxトラブルシューティング > LinuxにカスタムCA証明書を追加する方法|update-ca-trustとupdate-ca-certificatesの実践手順
「curlで社内サーバーにアクセスすると、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の設定が別途必要


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ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.

「1 added」と表示されれば登録成功です。/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

「OK」が表示されれば検証成功です。「unable to get local issuer certificate」が返ってきた場合は、CA証明書の配置かupdate-ca-trust/update-ca-certificatesの実行が不足しています。

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

証明書エラーが解消され 200 が返ってくれば成功です。HTTPS接続を含むLinuxサーバーの総合的なセキュリティ設定(SSL/TLS証明書管理・SELinux・firewalld)は、Linux Master Pro Seminarでハンズオン実習形式で体系的に身につけられます。

よくあるトラブルシュートと対処

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 に変換が必要

ステップ2:--cacertで直接CA証明書を指定して切り分ける

# CA証明書を直接指定すると通る場合 → トラストストアへの登録が未反映 $ curl --cacert /tmp/myca.pem https://internal-server.example.com/

ステップ3:中間CA証明書が不足していないか確認する

サーバー証明書がルート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

「issuer」に中間CA名が表示された場合は、その中間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を含むセキュリティ設定を実機操作で習得できます。

>> Linux Master Pro Seminarの詳細を見る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。