web-dev-qa-db-ja.com

CURLでSSLページを読み取る(php)

Phpおよびcurlライブラリを使用して、安全な(httpsを使用する)Webページのコンテンツをダウンロードしようとしています。

ただし、読み取りに失敗し、エラー60が表示されます。「SSL証明書の問題、CA証明書に問題がないことを確認してください。」

「詳細:SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました」

だから...かなり自明なエラーメッセージです。

私の質問は次のとおりです。SSL証明書(正しい証明書)を送信し、このページを取得して検証し、許可する方法を教えてください。

また、ここにあなたが疑問に思っている場合の私のオプションの配列があります:

    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLOPT_SSL_VERIFYHOST => 1,
    );

どんな提案でも素晴らしいだろう、アンドリュー

34
Andrew

エラーを誤って解釈しているようです。あなたが接続しているサイトは自己署名または他の一般的な問題のように思えます。通常のブラウザの警告と同様に、最も簡単な回避策はチェックを無効にすることです。

CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTFALSEに設定する必要があります。これにより、2つのメインチェックが無効になります。両方とも必要ではないかもしれませんが、少なくともこれでうまくいくはずです。

明確にするために、これはあなたを保護するために設計された機能を無効にします。他の方法で証明書とサーバーを検証した場合にのみ、これを行います。

PHPサイトの詳細: curl_setopt()

50
Ryan Graham

SSLピア検証を使用する場合(オフにすることは必ずしも良い考えではありません)、すべてのアプリケーションに対してグローバルにWindowsで次のソリューションを使用できます。

  1. ここからルート証明書付きのファイルをダウンロードします。 http://curl.haxx.se/docs/caextract.html
  2. Php.iniに追加します。

curl.cainfo=C:/path/to/cacert.pem

これはすべて魔法です。CURLは証明書を検証できるようになりました。

(Linuxでは、少なくともUbuntuではそのような問題はないと知っているので)

21
WayFarer

SOに関するアドバイスに従った後でも、次のようなエラーに問題がある可能性があります。

error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error

問題はSSLバージョンにあります。バージョン3には次を使用します

curl_setopt($ch, CURLOPT_SSLVERSION,3)

Uはピアとホストの検証も有効にしており、実際の証明書ファイルを指していると想定しています。例えば。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cacert.pem");
6
pkanane

これはopensslとVeriSignの「問題」です。

同様の問題があり、opensslには、サーバー証明書に署名するためにVeriSignが使用する中間SSL証明書がありませんでした。

https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657

これらの中間証明書をVeriSignホームページまたはFirefox cert-database-exportからローカルca-certificatesリストにインポートする必要があり、この手順の後、エラーなしでwget/curlを使用して保護された接続を使用できました。

2
Comradin

開発者のマシンの場合-この証明書をシステムに追加することもできます。このようなもの- https://www.globalsign.com/support/intermediate/intermediate_windows.php これはWinXP用ですが、他のバージョンでも動作します窓の。

これは明らかにopensslのバグにあります。 Tomcatは、使用可能な暗号リストを制限することにより、/ etc/Tomcat7/server.xmlでこれを回避するように構成できます。

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>
0
Sreedhar GS

SSL証明書を送信していません。接続しているホストにSSL証明書がインストールされているため、SSL証明書に問題があるようです。オプション-kまたは--insecureを使用して、苦情を乗り越えます。

あ。ライアン・グラハムの答えをご覧ください

0
PartialOrder