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.
「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 / )
CURLがサーバーから提供された証明書を検証できないため、失敗しています。
これを機能させるには2つの方法があります。
Curlに安全でない接続を許可する-k
オプションを指定してcURLを使用します。つまり、cURLは証明書を検証しません。
ルートCA(サーバー証明書に署名しているCA)をetc/ssl/certs/ca-certificates.crt
に追加します
セキュアFTPサーバーに接続していることを確認するためのオプションであるため、オプション2を使用してください。
この問題を解決するために、cURLスクリプトに1行のコードを追加しました。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
警告 :これはリクエストを絶対に安全でないものにします(@YSUによる回答を参照)。
Git Extensions v3.48をインストールした後にこの問題が発生しました。再度mysysgitをインストールしようとしましたが、同じ問題です。最後に、無効にしなければなりませんでした(セキュリティへの影響を考慮してください!)
git config --global http.sslVerify false
ドメイン証明書をお持ちの場合はそれを追加してください(Win7)
C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
私の場合は、cURLで消費しようとしていたサービスへの証明書のインストールに問題があることがわかりました。 中間証明書とルート証明書をドメイン証明書にバンドル/連結できませんでした 。 Chromeが中間証明書とルート証明書を除外したにもかかわらず証明書を受け入れて受け入れたため、これが問題であることは最初は明白ではありませんでした。
証明書をバンドルした後、すべて正常に機能しました。私はこのようにまとめました
$ cat intermediate.crt >> domain.crt
そして、すべての中間証明書とルート証明書について繰り返しました。
最近このエラーに遭遇しました。ルート証明書が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命名規則を使用してルート証明書を正しくインストールしてください。
ほとんどの場合、サーバーから証明書が欠落しています。
ルート - >中間 - >サーバー
サーバーは最低限Server&Intermediateを送信する必要があります。
問題をデバッグするにはopenssl s_client -showcerts -starttls ftp -crlf -connect abc:21
を使用してください。
証明書が1つだけ返却される場合(自己署名または発行)、次のどちらかを選択する必要があります。
curl -k
(とても悪い考え)サーバーから複数が返されたが、自己署名(ルート)証明書は含まれていない場合
サーバーがルートCA証明書を返した場合、それは自分のCAストアにはありません。選択肢は次のとおりです。
期限切れまたは失効した証明書は、それを示すメッセージがないため無視しました。しかし、openssl x509 -text
で証明書を調べることができます
あなたがホームエディション( https://www.cerberusftp.com/support/help/installing-a-certificate/ )ftpサーバーに接続しているとすれば、私はそれが自己署名されていると言うつもりです。
Opensslの出力など、詳細を投稿してください。
私にとっては、証明書を簡単にインストールすることが役に立ちました。
Sudo apt-get install ca-certificates
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
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
もう一度やり直してください
私の場合は違いました。ファイアウォールの内側にあるサイトをホストしています。エラーは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サーバーによって適切に処理され、ログインページを送信することによって応答したファイアウォールに転送されませんでした。
Windowsでは、私はこの問題を抱えていました。 Curlはmysysgitによってインストールされたので、最新バージョンをダウンロードしてインストールすることが私の問題を解決しました。
そうでなければ、これらはまともな 指示 あなたが試すことができるあなたのCA証明書を更新する方法についてです。
これまでのところ、私はこの問題が企業ネットワーク内で発生するのを見ました。2つの理由があります。どちらか一方または両方があなたの場合に起こり得るのです。
副次的な注意として、上記の第2はあなたがスキャンされていると思われる安全なTLSトラフィックについて不安にさせるかもしれません。それがあなたにとっての企業の世界です。
はい、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)