web-dev-qa-db-ja.com

cURLでhttpsのSSL接続を有効にするPHP(ヘッダーは空白)

私は、ファニーメイのウェブサイト(https)から当日の金利にアクセスするためのcURLスクリプトを書いています。 CURLOPT_SSL_VERIFYPEERを通り抜けることができなかった、true);オプション。

ユーザー名やパスワードは必要ありませんが、SSL検証をオンにする必要があります。

XAMPP開発サーバーでのテスト。

FFを使用してWebサイトから.crtおよび.pem証明書をダウンロードし、同じソースディレクトリに保存し、CURLOPT_CAINFOを使用して両方をポイントしましたが、うまくいきませんでした

http://curl.haxx.se/ca/cacert.pem から最新のcacert.pemファイルをダウンロードし、CURLOPT_CAINFOを使用してそれを指定しましたが、うまくいきません。

CURLOPT_SSL_VERIFYPEERをfalseにすると、ヘッダーを取得できますが(以下を参照)、trueに設定するとヘッダーがありません。

ここで検索してcURLのphpドキュメントを読み、そこにリストされているいくつかの回避策を試してみて、運が悪かったことを確認し、7〜8個のソリューションを試してみました。

CURLOPT_SSL_VERIFYPEERを使用してヘッダーと最終的に本文を取得できるようにする必要があります、true

どんな助けでもありがたいです。

<?php

// script is designed to access an https site and retrieve the last table showing the most recent 90 day commitment for the Fannie Mae 30 year fixed rate mortgage.  Site is designed to work with cookies and has a valid SSL cert.

//turn error reporting on
error_reporting(E_ALL); ini_set("display_errors", 1); 

// cookie file name/location
$cookie_file_path = "cookies.txt";

// verify if cookie file is accessible and writable
if (! file_exists($cookie_file_path) || ! is_writable($cookie_file_path))
{
    echo 'Cookie file missing or not writable.';
    exit;
}

// url connection
$url = "https://www.fanniemae.com/content/datagrid/hist_net_yields/cur30.html";

// Initiate connection
$ch = curl_init();

// Set cURL and other options
curl_setopt($ch, CURLOPT_URL, $url); // set url
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); // set browser/user agent
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // automatically follow Location: headers (ie redirects)
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // auto set the referer in the event of a redirect
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // make sure we dont get stuck in a loop
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 10s timeout time for cURL connection
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // allow https verification if true
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // check common name and verify with Host name
curl_setopt($ch, CURLOPT_SSLVERSION,3); // verify ssl version 2 or 3
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "VeriSignClass3PublicPrimaryCertificationAuthority-G5.pem"); // allow ssl cert direct comparison
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); // get header
curl_setopt($ch, CURLOPT_NOBODY, true); // exclude body
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE); // set new cookie session
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); // file to save cookies in
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); // file to read cookies in

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL connection, save cookie file, free up system resources
curl_close($ch);

// show header
function read_header($ch, $string) {
    print "Received header: $string";
    return strlen($string);
}
?>

これは、CURLOPT_SSL_VERIFYPEERがfalseに設定されている場合に受信されるヘッダーで、trueの場合は空白です

受信ヘッダー:HTTP/1.1 200 OK受信ヘッダー:日付:2013年9月19日木曜日00:40:16 GMT受信ヘッダー:サーバー:Apache受信ヘッダー:Set-Cookie:JSESSIONID = 4297C1E1760A836F691FE821FBF8B805.cportal-cl01;パス= /;安全; HttpOnly受信ヘッダー:Cache-Control:no-store受信ヘッダー:Expires:Wed、31 Dec 1969 23:59:59 GMT受信ヘッダー:プラグマ:no-cache受信ヘッダー:X-FRAME-OPTIONS:SAMEORIGIN受信ヘッダー:Content-言語:en-US受信ヘッダー:Content-Length:9344受信ヘッダー:Content-Type:text/html; charset = ISO-8859-1受信ヘッダー:

8
Optionwiz

curl_setopt($ch, CURLOPT_NOBODY, true);を使用して本文を除外しています。また、マシンに証明書をインストールする必要はないと思います。次の数行ですべてがわかります。

$url = 'https://www.fanniemae.com/content/datagrid/hist_net_yields/cur30.html';
$ch = curl_init();    
curl_setopt($ch, CURLOPT_URL, $url); // set url
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); // set browser/user agent    
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'read_header'); // get header
curl_exec($ch);

function read_header($ch, $string) {
    print "Received header: $string";
    return strlen($string);
}
11
subroutines