HTTPS URLにアクセスしようとするときに、cURLを使用して証明書をどのように処理しますか?


187

curlを使用して次のエラーが発生します。

curl:(77)証明書検証場所の設定エラー:
  CAfile:/etc/ssl/certs/ca-certificates.crt
  CApath:なし

この証明書確認場所を設定するにはどうすればよいですか?ありがとう。


2
どのOS /ディストリビューションを使用していますか?ca-certificatesパッケージをインストールする必要があります(それはdebian / ubuntuで呼ばれているものです)。
igorw

40
将来の参考のために、すでにca-certificatesインストールしましたが、エラーは解決しませんでした。問題は、証明書がでは/etc/ssl/certs/ca-certificates.crtなくに配置され/etc/pki/tls/certs/ca-bundle.crtていたため、環境変数CURL_CA_BUNDLEを正しいパスに設定するだけでした。
ロバート・スミス

13
涼しい!設定するとうまくいきますexport CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
2016年

回答:


82

このエラーはに関連して不足しているパッケージca-certificates。インストールしてください。

Ubuntu Linux(および同様のディストリビューション)の場合:

# apt-get install ca-certificates

Apt-Cyg経由のCygWin

# apt-cyg install ca-certificates

Arch Linux(Raspberry Pi)の場合

# pacman -S ca-certificates

ドキュメンテーションは言う:

このパッケージには、SSLベースのアプリケーションがSSL接続の信頼性を確認できるようにするCA証明書のPEMファイルが含まれています。

で見られるように:Debian-squeezeのca-certificatesパッケージに関する詳細


97
ca-certificatesはすでに最新バージョンですが、それでもエラーが発生します
ボーン牧師

2
もちろん、curlとraw.github.comを使用して推奨される方法でapt-cygをインストールしようとすると、この同じエラーが発生します。
10gistic 2013年

11
Arch Linuxでは、も必要になる場合がありますpacman -S ca-certificates-utils。やった。
Mark Grimes

8
このパッケージはすでにインストールされています。この答えは役に立ちません。
JimmyJames 2017年

8
@PastorBones私はパッケージがすでに最新であるのと同じ問題を抱えていましたが、それは破損していたのでsudo apt install --reinstall ca-certificates、パッケージを再インストールして、表示されていたエラーを解決しました
Will

153

また、ca-certificatesの最新バージョンをインストールしましたが、それでもエラーが発生していました。

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

問題は、curlが証明書がパスにあることを期待して/etc/pki/tls/certs/ca-bundle.crtいたが、パスにあるために証明書が見つからなかったことでした/etc/ssl/certs/ca-certificates.crt

実行して証明書を目的の宛先にコピーする

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

私のために働いた。実行して存在しない場合は、ターゲットの宛先用のフォルダーを作成する必要があります

sudo mkdir -p /etc/pki/tls/certs

必要に応じて、上記のコマンドを変更して、宛先ファイル名がcurlが予期するパスと一致するようにします。つまり/etc/pki/tls/certs/ca-bundle.crt、エラーメッセージの「CAfile:」に続くパスに置き換えます。


31
ln -s更新するたびに再コピーしたくない場合は、シンボリックリンクを作成することもできます。
starbeamrainbowlabs 2015

4
rescuetimeFedora 25のアプリにも同じ問題がありましたsudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt。問題は解決しました。(CURL_CA_BUNDLEenv varが機能しませんでした)
GabLeRoux

私のubuntuではこれにより問題が解決しました:sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pemThe repository ... does not have a Release file証明書がないために実際に取得していました(Could not load certificates from ...)。
Marinos An

84

これをあなたに入れて .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(ロバートからのコメントを参照)


8
システムファイルを手動でマックアップする必要がない方法を提供していただき、ありがとうございます。ただし、証明書を使用する際のセキュリティは維持されます。
スティーブンジョンソン

ありがとうございました。これで、pyenvとcurlに関する同様の問題が解決しました。私はUbuntu 14.04を使用しており、すでにca-certificatesがインストールされています。
davidA

このアプローチは、xonsh(追加で動作$CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"します.xonshrc)。
m00am 2017年

念のため:ワンライナーバージョン:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew 2018年


20

エラーを回避する最も簡単な方法は、curlリクエストのどこかに-kオプションを追加することです。そのオプションは、「証明書なしでSSL引用への接続を許可します。」(curl --helpから)

これは、信頼しているCAによって署名されていない証明書を提示しているため、自分が思っているエンドポイントと通信していないことを意味していることに注意してください。

例えば:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

私に次のエラー応答を与えました:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

私は-kに追加しました:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

エラーメッセージはありません。おまけとして、今私はapt-cygをインストールしました。そして、ca-certificates。


10
それはエラーを回避するかもしれませんが、それはまた「安全な」接続を不安定にします。
Tim

1
あんまり。私の知る限り、安全な接続の暗号化をバイパスすることはできないため、暗号化されたままで、1つのエンドポイントのみに送信されます。私が間違っている場合、誰かが私を訂正しますが、実行する唯一のリスクは、中間者攻撃の犠牲になる可能性があるということです。curlを使用している場合でも、リスクはありません。
10gistic 2013

18
はい、そうです。「-k」オプションは「--insecure」の省略形です。中間者がいる場合、彼があなたのデータを使って何をしていると思いますか?ネタバレ注意:彼はそれを解読し、それを盗み、そしておそらくそれを修正して、安全でないストリームに注入し直しています。manページから直接: "-k、--insecure(SSL)このオプションは、curlが明示的に"安全でない "SSL接続および転送を実行することを許可します。すべてのSSL接続は、デフォルトでインストールされているCA証明書バンドルを使用して安全にすることを試みます。これにより、-k、-insecureを使用しない限り、「安全でない」と見なされるすべての接続が失敗します。
Tim

2
SSLが必要な場合は、プライバシーと検証が必要です—この-kフラグは、検証を失っていることを意味します。ニーズによっては、これで十分な場合もあります。ネットワークと通信しているサーバーが侵入者から保護されていると想定する場合、MITMは重要な攻撃です(その想定を行うことができますか?)。データの種類に応じてリスクが高まります(ソースコードと証明書は画像よりも危険です)。転送後にデータの整合性を確認できますが(チェックサムなど)、信頼をそのチェックサムチャネルに移しています。結局-k、あなたはかなり多くの仕事をあなたに与えます。
マークフォックス

つまり、自己署名証明書を使用しているということです。オプション-kを使用する必要があります。自己署名証明書を検証できない可能性があるので?
Linus 14

15

@roensは正しいです。これはすべてのAnacondaユーザーに影響し、以下のエラーが発生します
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

回避策は、デフォルトのシステムカールを使用して、先頭に追加されたAnaconda 変数をいじるのを避けることPATHです。あなたはどちらか

  1. Anaconda curlバイナリの名前を変更します:)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. またはアナコンダカールを取り除く
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl Githubの問題 https://github.com/conda/conda-recipes/issues/352


いいですね、アナコンダが私の優先順位を盗んでいることに気づきませんでした。私は交換したら、それは働いたcurlフルパスで/usr/bin/curl
jxramos

これは大いに役立ちました!ありがとう。
Shababb Karim

12

から$ man curl

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.

7

WindowsのXAMPPで実行されているPHPコードの場合、php.iniを編集して以下を含める必要があることがわかりました

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

次に、ファイルhttps://curl.haxx.se/ca/cacert.pemにコピーして、名前をcurl-ca-bundle.crtに変更し、\ xamppパスの下に配置します(curl.capathを機能させることができませんでした)。 。また、cURLサイトのCAbundleは接続先のリモートサイトには不十分であることがわかったため、http: //winampplugins.co.ukにあるカール7.47.1のコンパイル済みWindowsバージョンにリストされているものを使用しました。 /カール/


Windowsでは、次のようにphpの前に「xampp」を追加することもできます:curl.cainfo = "C:\ xampp \ php \ extras \ cacert.pem"
Ryan Steyn

7

私はまったく同じ問題を抱えていました。/etc/ssl/certs/ca-certificates.crt結局のところ、私のファイルは不正な形式でした。最後のエントリは次のようなものを示しています:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

before -----END CERTIFICATE-----に改行を追加した後、curlは証明書ファイルを処理できました。

私のupdate-ca-certificates命令は私に警告を与えなかったので、これは見つけるのがとても面倒でした。

これはcurlのバージョン固有の問題である場合とそうでない場合があるため、ここに私のバージョンを示します。

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 

6

これは私のために働いた

sudo apt-get install ca-certificates

次に、証明書フォルダに移動します

sudo cd /etc/ssl/certs

次に、ca-certificates.crtファイルを /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

tls / certsフォルダーがない場合:作成し、chmod 777 -R folderNAMEを使用して権限を変更します


1
私はこれを試しましたが、これは私にとってはうまくいきませんでしたが、それでも同じエラーが発生します。何か案は ?
Anirudh 2015年

6

この問題を修正するもう1つの方法は、証明書の検証を無効にすることです。

echo insecure >> ~/.curlrc

1
回避策ですが、curl証明書を使いすぎると役に立ちます。ありがとう。
K.ゴル

4

curlはSSLデフォルトで証明書の検証を実行します。Certificate Authority (CA)公開鍵(CA。デフォルトのバンドルはcurl-ca-bundle.crtという名前です。--cacertオプションを使用して代替ファイルを指定できます。

このHTTPSサーバーがバンドルに含まれるCAによって署名された証明書を使用する場合、証明書の問題が原因で証明書の検証が失敗した可能性があります(有効期限が切れているか、名前がURLのドメイン名と一致していない可能性があります)。

curlによる証明書の検証をオフにする場合は、-k(または--insecure)オプションを使用します。

例えば

curl --insecure http://........

3
CAに対して証明書を適切に検証しないと、「ソース」が誰なのかわからないため、ここでは「ソースを信頼する」ことはかなり重要ではありません。
ジェフアレン

4

あなたのカールは、CA証明書などを含む存在しないファイルを指しているようです。

curlを使用したCA証明書に関する主要なリファレンスについては、https://curl.haxx.se/docs/sslcerts.htmlを参照してください。


3

システムにないフォルダを作成するだけです。

/ etc / pki / tls / certs /

次のコマンドを使用してファイルを作成します。

sudo apt-get install ca-certificates

次に、証明書をコピーして、エラーに表示されている宛先フォルダーに貼り付けます。私のものは「with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in」でした。エラーで言及されている正確な場所にファイルを貼り付けてください。次のコマンドを使用して、貼り付けをコピーします。

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

修繕。


上位の回答はどれもうまくいきませんでしたが、うまくいきました!
Prachiti Prakash Prabhu

2

それだけの価値があるのですが、チェックwhich curlが実行されていることも重要です。

私が管理している共有マシンのユーザーがこのエラーを受け取っていました。しかし、原因は彼らがAnaconda(http://continuum.io)をインストールしたためであることが判明しました。そうすることで、標準の前に、アナコンダのバイナリパスを入れて$PATH、そしてそれは、独自のに付属しているcurlデフォルトの本命探しトラブルだったバイナリ、されたこのUbuntuマシンにインストールします。


1
私はwhich -a curl利用可能なすべてのものを確認することを確認することをお勧めします。もちろん、どれが一番上に来るかに注意してください。
jxramos 2018年

1

あなたは、LinuxでのMacOS上の自作やlinuxbrewを使用している場合は、再インストールしようopensslcurlから、次の手順で、このページ

このエラーメッセージは、curlがopensslを使用して安全な接続を確立できないことを示しています。opensslを再インストールすると問題が解決するはずです。curlとgitの両方で安全でない接続を一時的に利用して、必要なファイルをダウンロードするには、次のコマンドを実行します。

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

次に、opensslとcurlをインストールまたは再インストールします。

HOMEBREW_CURLRC=1 brew reinstall openssl curl

最後に、curlとgitが安全な接続を再び使用できるように、セキュリティの変更を元に戻します。

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

結果を確認するには、新しいシェルセッションを開始する必要がある場合があります。

curl -v https://github.com # or any other https urls.

出力に次の出力が表示される場合、問題は解決されているはずです。

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

参照:


何時間も試した後。これは私を救った。macosに最適なソリューションがついに登場。どうもありがとう!:)
mrateb

1

同じ問題があります。高山ベースのDockerイメージを構築していて、自分の組織のWebサイトに丸めたい場合、このエラーが表示されます。それを解決するには、会社のCA証明書を取得する必要があります。次に、イメージのCA証明書に追加する必要があります。

CA証明書を取得する

OpenSSLを使用して、Webサイトに関連する証明書を取得します。

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

これは次のようなものを出力します:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

最後の証明書(-----BEGIN CERTIFICATE-----とに
-----END CERTIFICATE-----含まれるマークアップ間のコンテンツ)を取得し、ファイル(たとえば、mycompanyRootCA.crt)に保存します。

画像を作成する

次に、アルパインからdockerイメージをビルドするときに、次の手順を実行します。

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

これで画像が正しく機能します。\ o /


1

それでも問題が解決しない場合は、これを試してみてください。/etc/ssl/certs/ディレクトリ内のファイルを削除してから、ca-certificatesを再インストールします。

sudo apt install ca-certificates --reinstall

Linuxbrewをインストールしようとしたときにこれをしました。


1
これは役に立ちましたが、自分のマシン上のファイルを削除しませんでした。単純なコマンドを実行するだけで、curlが機能し始めました。
Josefhu15

1

このソリューションが完璧に機能することを確認してください。

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

ここからこの解決策を見つけまし


0

このエラーは、PKIディレクトリ内のSSLチェーン証明書ファイルが破損しているか欠落していることが原因です。次の手順に従って、ファイルca-bundleを確認する必要があります。コンソール/ターミナルで:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

次のサイトを入力してください:https : //rpmfind.net/linux/rpm2html/search.php? query=ca-certificates、SOのca-certificateを取得します。ダウンロードのURLをコピーしてURLに貼り付けます:wget your_url_donwload_ca-ceritificated.rpm今すぐ、yout rpmをインストールします:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

今あなたのサービスを再起動します:私の例このコマンド:

sudo service2 httpd restart

0

私のためにうまく機能するgit bashで次のコマンドを実行してください

git config --global http.sslverify "false"

0

これは私のために修正されました:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem


0

以下は、問題を修正する手順を説明しています。
1.ファイルが定義URLに存在することを確認します。
2.そうでない場合は、URLからファイルをダウンロードします。https://curl.haxx.se/ca/cacert.pem
3.ファイルをコピーして、php.iniファイルの定義済みパスにペストします。
4. apacheサービスを再起動します。


0

私はこの問題を抱えていましたが、私のバージョンのCURLはDERエンコードされた証明書を解析できないことがわかりました(そして--cert-typeオプションにも注意を払っていませんでした)。証明書をPEM形式に変換すると機能しました。


0

私の場合、/etc/ssl/certs/ca-certificates.crtファイルがありませんでした。/etc/ssl/certs結局のところ、DockerイメージをビルドするときにDockerfile内からのコンテンツを削除しました。シェルスクリプトを調整した後、Dockerfile内から実行されるbashコマンド-curlは新しいコンテナー内から完璧に動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.