InfraAcademy

InfraAcademy Blog

curlコマンドで”curl: (60) SSL certificate problem: unable to get local issuer certificate”というエラーの対処方法解説【Linux】

| #Linux #コマンド

Linuxでcurlコマンドを実行したときに、以下のエラーが表示されることがあります。

curl: (60) SSL certificate problem: unable to get local issuer certificate

インターネットで調べると、-k--insecureを付ける方法がよく出てきます。

確かに通信できる場合はあります。しかし、証明書の確認を省略しているだけなので、根本的な解決にはなりません。

では、どうすればよいのでしょうか?

この記事では、エラーが発生する原因と、安全に解決する方法を初心者向けに解説します。

curl: (60)のエラーとは?

このエラーは、curlが接続先の証明書を信頼できるか確認できなかったときに発生します。

HTTPSで接続するとき、curlはサーバー証明書から中間CA証明書、ルートCA証明書まで正しくつながっているか確認します。このつながりを証明書チェーンと呼びます。

証明書チェーンを最後まで確認できないと、curlは接続先が安全なのか判断できません。

そのため、通信を止めてエラーを表示します。

主な原因

原因は、大きく分けると以下の4つです。

原因 よくある状況
Linux側にCA証明書がない 社内CAや独自CAを使っている
CA証明書が古い OSを長期間更新していない
サーバー側の設定不足 中間CA証明書が設定されていない
プロキシが証明書を置き換えている 社内ネットワークやセキュリティ製品を利用している

私の環境で発生したときは、Linux側に必要なCA証明書が入っていないことが原因でした。

エラーだけを見るとcurlの問題に見えますが、実際にはLinux側やWebサーバー側の証明書設定が原因であることが多いです。

まずはcurl -vで確認する

いきなり設定を変更するのではなく、まずは詳しい接続情報を確認します。

curl -v https://example.com/

-vは、通信の詳しい内容を表示するオプションです。

実行結果には、curlが参照しているCA証明書の場所が表示されます。

* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* SSL certificate problem: unable to get local issuer certificate

ここで表示されたCAfileCApathを確認しておきましょう。

curlのバージョンも確認できます。

curl --version

古いサーバーでは、curlやCA証明書のパッケージが長期間更新されていないことがあります。

複数のHTTPSサイトで同じエラーが出る場合は、Linux側のCA証明書を疑ってみてください。

Ubuntu・DebianでCA証明書を更新する

UbuntuやDebian系では、ca-certificatesパッケージを更新します。

sudo apt update
sudo apt install --reinstall ca-certificates
sudo update-ca-certificates

更新後に、もう一度curlを実行します。

curl https://example.com/

これで通信できれば、CA証明書が古い、または正常に作成されていなかった可能性があります。

社内CAを追加する

社内システムなどで独自のCAを使っている場合は、管理者から受け取ったCA証明書を追加します。

sudo cp local-company-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

その後、接続を確認します。

curl https://internal.example.local/

出所が分からない証明書は追加しないでください。

CA証明書を追加すると、そのCAが発行した証明書をLinux全体で信頼するようになります。

RHEL・Rocky Linux・AlmaLinuxで更新する

RHEL系では、update-ca-trustを使用します。

sudo dnf reinstall ca-certificates
sudo update-ca-trust extract

古いCentOSなどでyumを使う場合は、以下のように実行します。

sudo yum reinstall ca-certificates
sudo update-ca-trust extract

社内CAを追加するときは、証明書を以下の場所へ配置します。

sudo cp local-company-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract

追加後にcurlを実行し、エラーが解消したか確認します。

--cacertで証明書を個別に指定する

Linux全体の設定を変更したくない場合は、--cacertでCA証明書を指定できます。

curl --cacert local-company-ca.crt https://internal.example.local/

この方法では、実行したcurlコマンドだけが指定したCA証明書を使います。

検証環境や、一部の社内サービスだけで独自CAを使う場合に便利です。

サーバー側の証明書チェーンを確認する

特定のWebサイトだけでエラーが発生する場合は、サーバー側に問題がある可能性があります。

OpenSSLを使うと、サーバーから返される証明書を確認できます。

openssl s_client \
  -connect example.com:443 \
  -servername example.com \
  -showcerts

出力の最後に、以下が表示されるか確認します。

Verify return code: 0 (ok)

エラーが表示される場合は、サーバー証明書だけでなく、中間CA証明書まで正しく設定されているか確認してください。

Let's Encryptなどでは、サーバー証明書単体ではなく、証明書チェーンを含むfullchain.pemを設定します。

この場合はcurl側で回避するのではなく、NginxやApacheの証明書設定を修正するのが正しい対処です。

Dockerコンテナ内だけで発生する場合

ホストOSではcurlが成功するのに、Dockerコンテナ内では失敗することがあります。

コンテナはホストOSとは別の環境です。ホストにCA証明書を追加しても、自動では反映されません。

Ubuntu系のコンテナであれば、DockerfileにCA証明書を追加します。

FROM ubuntu:24.04

RUN apt-get update \
    && apt-get install -y ca-certificates

COPY local-company-ca.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates

コンテナ内だけでエラーになる場合は、コンテナ側にCA証明書が入っているかを確認してみてください。

-kや--insecureを常用してはいけない

-kまたは--insecureを付けると、証明書の検証を無効にできます。

curl -k https://example.com/

これで通信できても、証明書の問題を直したわけではありません。

HTTPSで暗号化されていても、接続先が本物なのか確認できなくなります。

そのため、本番環境やAPIキー、パスワードを送信する通信では使わないようにしてください。

原因の切り分けには使える

管理している検証環境で、証明書以外の通信を確認したい場合は、一時的な切り分けに使うことがあります。

curl -k https://localhost/

このコマンドでは成功し、通常のcurlでは失敗するなら、証明書の検証部分に問題があると判断できます。

確認が終わったら、CA証明書やサーバー側の設定を修正しましょう。

それでも解決しない場合

CA証明書を更新しても解決しない場合は、OSの時刻も確認します。

date
timedatectl

証明書には有効期間があるため、時刻が大きくずれていると検証に失敗します。

また、別のHTTPSサイトにもcurlを実行してみてください。

curl https://example.com/

複数のサイトで失敗するならLinux側、特定のサイトだけで失敗するならWebサーバー側の可能性が高くなります。

Linuxの時刻設定は、Linuxで時刻を確認・変更する方法で解説しています。

まとめ

curl: (60) SSL certificate problem: unable to get local issuer certificateは、curlが証明書の発行元を確認できないときに発生します。

まずはcurl -vで、curlが参照しているCA証明書を確認してください。

そのうえで、以下の順番で原因を切り分けます。

  1. LinuxのCA証明書を更新する
  2. 社内CAを正しい場所へ追加する
  3. サーバー側の中間CA証明書を確認する
  4. Dockerコンテナ内のCA証明書を確認する
  5. OSの時刻を確認する

-kを付ければ、一時的に通信できる場合があります。

しかし、安全な解決方法ではありません。証明書を検証できない原因を確認し、Linux側またはサーバー側の設定を修正することが大切です。

私も最初は、curlが動かないことだけに目が向いていました。

ただ、CA証明書と証明書チェーンの関係が分かると、何を確認すればよいのか整理できるようになります。

Linuxやサーバー構築を実際に学びたい方へ

Linuxのエラーは、コマンドだけを覚えても解決できないことがあります。

今回のように、Linux、curl、証明書、Webサーバーの関係を一つずつ確認する力が必要です。

基礎からLinuxを学びたい方は、Linux入門講座を確認してみてください。

Webサーバーや証明書の設定まで学びたい方は、サーバー構築講座がおすすめです。

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る