web-dev-qa-db-ja.com

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

私はCurl and 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.crtと命名し(my-ca.pemファイルと命名して同じことを試しました)、それからこれを行いました:

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

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

100
user1270392

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

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

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

120
Dave Child

簡単な解決策

それは私の毎日のスクリプトです:

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
32
Antonio Feitosa

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

25
Somaiah Kumbera

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

15
ano

私は実際にこの種の問題を抱えていました、そして私はこれらのステップによってそれを解決します:

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

  2. php.iniファイルを探す

  3. curl.cainfoを証明書のパスに設定します。だからそれは何かのようになります:

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

7
geckob

ここでは、Mozilla CA証明書をダウンロードして変換するための手順が記載されたCA証明書を見つけることができますca-bundle.crtまたはcacert.pemを取得したら、使用するだけです。

curl.exe --cacert cacert.pem https://www.google.com

または

curl.exe --cacert ca-bundle.crt https://www.google.com
2
lmiguelmh

私が既存のシステムのデフォルトのCAファイルを使用することができた問題を尊敬したので、debian6ではこれは次のとおりです。

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

rootとしてこれは次のようにすることができます:

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

その後、Webサーバーを再起動します。

1
Jasen

あなたはこれを使うことができます

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);

1
Ahmed Ali

私にとっては、私は自動http-> httpsリダイレクトを持つWebサイトをテストしたいだけでした。いくつかの証明書が既にインストールされていると思うので、これだけで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を実行しているUbuntu 16.04で動作します。

curl --proto-default https <target>

0
SamCyanide