8

我正在编写一个 cURL 脚本来访问来自 https 的 Fannie Mae 网站的当前利率。我无法通过 CURLOPT_SSL_VERIFYPEER,真的);选项。

不需要用户名或密码,但是我需要打开 SSL 验证。

在 XAMPP 开发服务器上进行测试。

我已经使用 FF 从网站下载了 .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 路径=/; 安全的; HttpOnly 接收到的标头:Cache-Control: no-store 接收到的标头:过期:星期三,1969 年 12 月 31 日 23:59:59 GMT语言:en-US 收到的标头:Content-Length:9344 收到的标头:Content-Type:text/html;charset=ISO-8859-1 收到的标头:

4

1 回答 1

12

您正在通过使用排除身体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);
}
于 2013-09-19T03:02:01.843 回答