コマンドラインからCURLを使用したhttps接続


127

私はCurlとCacertsの世界に不慣れで、サーバーへの接続中に問題に直面しています。基本的に、あるマシンから別のマシンへのhttpsを介した接続をテストする必要があります。マシンA(Linuxマシン)から接続する必要があるURLがあります。コマンドプロンプトでこれを試しました

cmd> curl https://[my domain or IP address]

次のものを得た:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

インターネットでいくつかの記事を読むときに、私はこれを行いました:

openssl s_client -connect <domain name or Ip address>:443

サーバー証明書を含むいくつかの応答を得ました(内部-----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----)。

ここから次に何をしますか?私は、テキストを内部にコピーして貼り付け、BEGIN CERTIFICATE & END CERTIFICATEファイルに保存する必要があると思い ます。しかし、それはどのタイプのファイルであるべきですか?.pem.crt?..その後はどうすればいいですか?

私はこれを試しました-テキストをコピーBEGIN CERTIFICATE & END CERTIFICATEして.crtファイルに保存しました-名前を付けてmy-ca.crtmy-ca.pemファイルとして名前を付けて同じことを試しました)、これを行いました:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

しかし、同じエラーが発生しました。


わからない解決策について、あなたは示唆しているが、私はちょうど同様の情報を探していたと私はPHPとカールを使用するためのこの便利なサイトを見つけましたunitstep.net/blog/2009/05/05/...
MauroPerez

1
--insecureSSLエラーを無視するように追加することもできます。
Alexej Magura

カールの新しいバージョン(例えば7.64)はRC4-SHAなどの古い暗号を認識しない-カールの古いバージョン(7.46)を使用して、私を助けserverfault.com/questions/889631/...
hello_earth

回答:


142

同じ問題が発生しました-自分のサイトからページを取得していて、HTTPS経由で提供されていましたが、curlは同じ「SSL証明書の問題」メッセージを出していました。私はそれを回避するために-k安全でない接続を許可するために呼び出しにフラグを。

curl -k https://whatever.com/script.php

編集:私は問題の根本を発見しました。私はSSL証明書(StartSSLからのものですが、それほど重要ではないと思います)を使用していて、中間証明書を適切に設定していませんでした。上記のuser1270392と同じ問題が発生している場合は、SSL証明書テストし、問題を修正してから修正することを勧めしますcurl -k


5
-kフラグは便利なショートカットです。私のために働いた!
tidydee 2018年

45

シンプルなソリューション

それが私の毎日のスクリプトです。

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

出力:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact

11
したがって、--insecure毎日TSLを介した接続を許可しています...
Brethlosze

2
@Brethloszeコメントありがとうございます。しかし、そうではありません。ポイントは、あらゆる種類の証明書からSSL情報を取得することです。
アントニオフェイト

30

curlにはCA証明書が付属していないため、curlに証明書チェーン全体を提供する必要があります。cacertオプションは1つのファイルしか使用できないため、完全なチェーン情報を1つのファイルに連結する必要があります

証明書チェーンを(ブラウザーなどから)DERエンコードされたバイナリーx.509(.cer)にコピーします。証明書ごとにこれを行います。

証明書をPEMに変換し、1つのファイルに連結します。

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

これを行う方法についてのブログをここに書きました:http : //javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
userNameとPasswordを渡す目的を説明できますか?Javaクライアントを作成している場合、その場合、GETリクエストのヘッダーでuserNameとpasswordを渡す必要がありますか?
Shubhi224 2018

@ Shubhi224は、httpsサーバーがGETリクエストに対して単純な認証を必要としない場合はできません。認証を必要とするのはREST呼び出しであるため、認証を使用する必要がありました。
Somaiah Kumbera

この回答で述べたように、「curlにはCA証明書が同梱されなくなったため、curlに証明書チェーン全体を提供する必要があります。」
モハメド・バナ

16

ファイル--cacertを指定するために使用します.crtca-root-nss.crt例えば。


6

私は実際にこの種の問題を抱えており、次の手順で解決します。

  1. こちらからルートCA証明書のバンドルを取得します:https : //curl.haxx.se/ca/cacert.pemそしてローカルに保存します

  2. php.iniファイルを見つける

  3. curl.cainfo証明書のパスに設定します。したがって、次のようになります。

curl.cainfo = /path/of/the/keys/cacert.pem



1

既存のシステムデフォルトCAファイルを使用できた問題を無視したため、debian6では次のようになります。

/etc/ssl/certs/ca-certificates.crt

ルートとしてこれは次のように行うことができます:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

次に、Webサーバーを再起動します。



0

私にとっては、自動のhttp-> httpsリダイレクトがあるWebサイトをテストしたかっただけです。私はすでにいくつかの証明書をインストールしていると思うので、これだけでUbuntu 16.04が実行されていますcurl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>


-2

curlの最新バージョンでは、-resolveまたは--connect-to(バージョン7.49より新しいcurl)を使用して、接続するIPアドレスを単に上書きできます。これはSSL / SNIでも機能します。詳細はすべてマニュアルページにあります。

たとえば、DNSをオーバーライドし、特定のIPアドレスを使用してsslでwww.example.comに接続するには:(これによりipv6もオーバーライドされます)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

別の例では、ポート8080でbackend1という名前の特定のバックエンドサーバーに接続します。

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

サーバーが正しく応答する必要がある場合は、ホストヘッダーを必ず追加してください。

-H 'Host:www.example.com' 

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