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
ここで表示されたCAfileやCApathを確認しておきましょう。
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証明書を確認してください。
そのうえで、以下の順番で原因を切り分けます。
- LinuxのCA証明書を更新する
- 社内CAを正しい場所へ追加する
- サーバー側の中間CA証明書を確認する
- Dockerコンテナ内のCA証明書を確認する
- OSの時刻を確認する
-kを付ければ、一時的に通信できる場合があります。
しかし、安全な解決方法ではありません。証明書を検証できない原因を確認し、Linux側またはサーバー側の設定を修正することが大切です。
私も最初は、curlが動かないことだけに目が向いていました。
ただ、CA証明書と証明書チェーンの関係が分かると、何を確認すればよいのか整理できるようになります。
Linuxやサーバー構築を実際に学びたい方へ¶
Linuxのエラーは、コマンドだけを覚えても解決できないことがあります。
今回のように、Linux、curl、証明書、Webサーバーの関係を一つずつ確認する力が必要です。
基礎からLinuxを学びたい方は、Linux入門講座を確認してみてください。
Webサーバーや証明書の設定まで学びたい方は、サーバー構築講座がおすすめです。