私は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]
しかし、同じエラーが発生しました。
私は同じ問題を抱えていた - 私は自分のサイトからHTTPS経由で配信されているページを取得していたが、curlが同じ「SSL証明書問題」メッセージを出していた。安全でない接続を可能にするために、呼び出しに-k
フラグを追加することでそれを回避しました。
curl -k https://whatever.com/script.php
編集:私は問題の根本を発見しました。私はSSL証明書を使っていました(StartSSLからですが、それほど重要ではないと思います)そして中間証明書を正しく設定していませんでした。上記のuser1270392と同じ問題がある場合は、curl -k
修正プログラムに頼る前に、SSL証明書をテスト して 問題を修正することをお勧めします。
それは私の毎日のスクリプトです:
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
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
--cacert
ファイルを指定するには、.crt
を使用します。例えばca-root-nss.crt
。
私は実際にこの種の問題を抱えていました、そして私はこれらのステップによってそれを解決します:
ここからルートCA証明書のバンドルを取得します。 https://curl.haxx.se/ca/cacert.pem そしてローカルに保存します。
php.ini
ファイルを探す
curl.cainfo
を証明書のパスに設定します。だからそれは何かのようになります:
curl.cainfo = /path/of/the/keys/cacert.pem
ここでは、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
私が既存のシステムのデフォルトの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サーバーを再起動します。
あなたはこれを使うことができます
curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);
私にとっては、私は自動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>