web-dev-qa-db-ja.com

curl:(60)SSL証明書:ローカル発行者証明書を取得できません

root@sclrdev:/home/sclr/certs/FreshCerts# curl --ftp-ssl --verbose ftp://{abc}/ -u trup:trup --cacert /etc/ssl/certs/ca-certificates.crt
* About to connect() to {abc} port 21 (#0)
*   Trying {abc}...
* Connected to {abc} ({abc}) port 21 (#0)
< 220-Cerberus FTP Server - Home Edition
< 220-This is the UNLICENSED Home Edition and may be used for home, personal use only
< 220-Welcome to Cerberus FTP Server
< 220 Created by Cerberus, LLC
> AUTH SSL
< 234 Authentication method accepted
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
169
user3812540

「SSL証明書の問題:ローカル発行者証明書を取得できません」エラーに関する。むしろ、これはCURLリクエストを送信するシステムに適用されます(リクエストを受信するサーバーは適用されません)

1)最新のcacert.pemを https://curl.haxx.se/ca/cacert.pem からダウンロードします

2)php.iniに次の行を追加します(これが共有ホスティングであり、php.iniにアクセスできない場合、public_htmlの.user.iniに追加できます)。

curl.cainfo="/path/to/downloaded/cacert.pem"

パスを二重引用符で囲んでください!!!

3)デフォルトでは、FastCGIプロセスは300秒ごとに新しいファイルを解析します(必要に応じて、ここで提案されているようにいくつかのファイルを追加して頻度を変更できます https://ss88.uk/blog/fast-cgi-and -user-ini-files-the-new-htaccess /

180
Dahomz

CURLがサーバーから提供された証明書を検証できないため、失敗しています。

これを機能させるには2つの方法があります。

  1. Curlに安全でない接続を許可する-kオプションを指定してcURLを使用します。つまり、cURLは証明書を検証しません。

  2. ルートCA(サーバー証明書に署名しているCA)をetc/ssl/certs/ca-certificates.crtに追加します

セキュアFTPサーバーに接続していることを確認するためのオプションであるため、オプション2を使用してください。

90
Yuvika

この問題を解決するために、cURLスクリプトに1行のコードを追加しました。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

警告 :これはリクエストを絶対に安全でないものにします(@YSUによる回答を参照)。

60
Vijay Bhandari

Git Extensions v3.48をインストールした後にこの問題が発生しました。再度mysysgitをインストールしようとしましたが、同じ問題です。最後に、無効にしなければなりませんでした(セキュリティへの影響を考慮してください!)

git config --global http.sslVerify false

ドメイン証明書をお持ちの場合はそれを追加してください(Win7)

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
17
Riga

私の場合は、cURLで消費しようとしていたサービスへの証明書のインストールに問題があることがわかりました。 中間証明書とルート証明書をドメイン証明書にバンドル/連結できませんでした 。 Chromeが中間証明書とルート証明書を除外したにもかかわらず証明書を受け入れて受け入れたため、これが問題であることは最初は明白ではありませんでした。

証明書をバンドルした後、すべて正常に機能しました。私はこのようにまとめました

$ cat intermediate.crt >> domain.crt

そして、すべての中間証明書とルート証明書について繰り返しました。

13
Daniel Watrous

最近このエラーに遭遇しました。ルート証明書がCAストアディレクトリに正しくインストールされていないことに関連していました。 CAディレクトリを直接指定しているところでcurlコマンドを使用していました。 curl --cacert /etc/test/server.pem --capath /etc/test ...このコマンドは、 curl:(60)SSL証明書の問題で毎回失敗していました:ローカル発行者証明書を取得できません。

strace curl ...を使用した後、curlは、opensslハッシュ命名法に基づいた60ff2731.0という名前のルート証明書ファイルを探していたことが判明しました。だから私は効果的にルート証明書を正しくインポートするためにこのコマンドを見つけました:

ln -s rootcert.pem `openssl x509 -hash -noout -in rootcert.pem`.0

ソフトリンクを作成します

60ff2731.0 - > rootcert.pem

表紙の下のcurlはserver.pem certを読み、root certファイルの名前(rootcert.pem)を決定し、それをそのハッシュ名に変換してからOSファイル検索をしましたが、それを見つけることができませんでした。

そのため、問題を解決するには、curlエラーがあいまいなときにcurlを実行するときにstraceを使用し(非常に助かりました)、次にopenssl命名規則を使用してルート証明書を正しくインストールしてください。

10
gp-coder

ほとんどの場合、サーバーから証明書が欠落しています。

ルート - >中間 - >サーバー

サーバーは最低限Server&Intermediateを送信する必要があります。

問題をデバッグするにはopenssl s_client -showcerts -starttls ftp -crlf -connect abc:21を使用してください。

証明書が1つだけ返却される場合(自己署名または発行)、次のどちらかを選択する必要があります。

  1. サーバーを修理してもらう
  2. その証明書を信頼し、それをあなたのCA証明書ストアに追加する(最善策ではない)
  3. 信頼を無効にします。 curl -k(とても悪い考え)

サーバーから複数が返されたが、自己署名(ルート)証明書は含まれていない場合

  1. このチェーンのCAストアにCA(ルート)証明書をインストールします。発行者をグーグル。 ( _ only _ そのCAを信頼している場合)
  2. チェーンの一部としてCAを送信するようにサーバーを修正する
  3. チェーン内の証明書を信頼する
  4. 信頼を無効にする

サーバーがルートCA証明書を返した場合、それは自分のCAストアにはありません。選択肢は次のとおりです。

  1. それを追加(信頼)する
  2. 信頼を無効にする

期限切れまたは失効した証明書は、それを示すメッセージがないため無視しました。しかし、openssl x509 -textで証明書を調べることができます

あなたがホームエディション( https://www.cerberusftp.com/support/help/installing-a-certificate/ )ftpサーバーに接続しているとすれば、私はそれが自己署名されていると言うつもりです。

Opensslの出力など、詳細を投稿してください。

6
Jason Pyeron

私にとっては、証明書を簡単にインストールすることが役に立ちました。

Sudo apt-get install ca-certificates
5
Maxim Krušina

cURL docs に従って、証明書をcurlコマンドに渡すこともできます。

リモートサーバーを検証できるCA証明書を入手し、接続時に検証のためにこのCA証明書を指摘するための適切なオプションを使用します。 libcurlハッカーの場合:curl_easy_setopt(curl、CURLOPT_CAPATH、capath);

Curlコマンドラインツールを使って:--cacert [file]

例えば:

curl --cacert mycertificate.cer -v https://www.google.com
1

Windowsの場合 - cmdから起動した場合

> curl -X GET "https://some.place"

からcacert.pemをダウンロードしてください - https://curl.haxx.se/docs/caextract.html

環境変数を設定します。

CURL_CA_BUNDLE = C:\Program Files\curl-7.57.0\src\cacert.pem

環境の再読み込み

refreshenv

もう一度やり直してください

トラブルの原因: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/replies/ 95548

1
RaSor

私の場合は違いました。ファイアウォールの内側にあるサイトをホストしています。エラーはpfSenseによって引き起こされました。

Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|

この答え のおかげで、私は誤って原因を見つけました。


WANから 自分のサイト にアクセスしても問題ありません。

ただし、サイトがLAN内からアクセスされた場合(たとえば、WordpressがWANIP 49.x.x.xを使用しているにもかかわらず、自身のサーバーにcurlリクエストを送信した場合)、pfSenseログインページが表示されました。

証明書をpfSense webConfigurator Self-Signed Certificateとして識別しました。 curlがエラーを投げたのも不思議ではありません。

原因: curlがサイトのWAN IPアドレス49.x.x.xを使用していました。しかし、Webサーバーのコンテキストでは、WAN IPがファイアウォールでした。

デバッグ: pfSense証明書を取得していることがわかりました。

解決策: サイトをホストしているサーバーで、独自のドメイン名を127.0.0.1に設定します。

ソリューションを適用することによって、curlのリクエストはWebサーバーによって適切に処理され、ログインページを送信することによって応答したファイアウォールに転送されませんでした。

1
Gene

Windowsでは、私はこの問題を抱えていました。 Curlはmysysgitによってインストールされたので、最新バージョンをダウンロードしてインストールすることが私の問題を解決しました。

そうでなければ、これらはまともな 指示 あなたが試すことができるあなたのCA証明書を更新する方法についてです。

1
Steve

これまでのところ、私はこの問題が企業ネットワーク内で発生するのを見ました。2つの理由があります。どちらか一方または両方があなたの場合に起こり得るのです。

  1. ネットワークプロキシ が機能するため、これらには独自のSSL証明書があり、それによって表示される証明書が変更されます。多くのまたはほとんどの企業ネットワークでは、これらのプロキシを使用するように強制されています。
  2. クライアントPC上で実行されている一部の ウイルス対策プログラム もHTTPSプロキシと同様に機能するため、ネットワークトラフィックをスキャンできます。ウイルス対策プログラムには、この機能を無効にするオプションがあるかもしれません(管理者が許可していると仮定して)。

副次的な注意として、上記の第2はあなたがスキャンされていると思われる安全なTLSトラフィックについて不安にさせるかもしれません。それがあなたにとっての企業の世界です。

0
rdguam

はい、CA証明書も追加する必要があります。見やすくするためにNode.jsにコードスニペットを追加する。

var fs = require(fs)
var path = require('path')
var https = require('https')
var port = process.env.PORT || 8080;
var app = express();

https.createServer({
key: fs.readFileSync(path.join(__dirname, './path to your private key/privkey.pem')),
cert: fs.readFileSync(path.join(__dirname, './path to your certificate/cert.pem')),
ca: fs.readFileSync(path.join(__dirname, './path to your CA file/chain.pem'))}, app).listen(port)
0
Ravi Prakash