PHP CURLがHTTPSにアクセスしてHTTPSページのソースコードを取得する関数

4841 ワード

//今日は採集ページを書いて、PHP CURL httpsで意外にも間違いを報告して、いくつかの資料を集めて、PHP CURLがHTTPSのホームページのソースコードを取得する関数を完成しました.
function GetHtml($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, 'http://www.baidu.com/');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.6; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);   // ssl       
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // ssl       
    $code = curl_exec($ch);
    curl_close($ch);
    if (empty($code) or stristr($code, '403 Forbidden') or stristr($code, "
nginx") or stristr($code, "Error") or stristr($code, " ")) { exit(); } else { return $code; } } function curlPost($url, $data, $timeout = 30) { $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE; $ch = curl_init(); $opt = array( CURLOPT_URL => $url, CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_POSTFIELDS => (array) $data, CURLOPT_RETURNTRANSFER => 1, CURLOPT_TIMEOUT => $timeout, ); if ($ssl) { $opt[CURLOPT_SSL_VERIFYHOST] = 1; $opt[CURLOPT_SSL_VERIFYPEER] = FALSE; } curl_setopt_array($ch, $opt); $data = curl_exec($ch); curl_close($ch); return $data; } $data = curlPost('https://www.111cn.net', array('p' => 'hello')); echo ($data);

実はこれはサーバーにSSL認証を行わないことを教えて、本当にHTTPSを歩くのではありません
実際にHTTPSを使用する場合は、CA証明書が必要です
SSLについては、以下のように設定されています.コードは次のとおりです.
  1. CURLOPT_SSL_VERIFYPEERをtrueに設定し、SSL証明書の認証を行うことを説明する
  2. CURLOPT_SSL_VERIFYHOSTは2に設定し、厳格な認証を行うことを説明します
  3. CURLOPT_CAINFOが証明書に設定されているパス
/**
 *      ,     ~                     
 * curl POST 
 * @param   string  url 
 * @param   array      
 * @param   int            
 * @param   bool    HTTPS          
 * @return  string 
 */
function curlPost($url, $data = array(), $timeout = 30, $CA = true) {
    $cacert = getcwd() . '/cacert.pem'; //CA     
    $SSL = substr($url, 0, 8) == "https://" ? true : false;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout - 2);
    if ($SSL && $CA) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   //    CA       
        curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA   (            CA  )  
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //            ,               
    } else if ($SSL && !$CA) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //         
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); //              
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //  data        
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode  
    $ret = curl_exec($ch);
    //var_dump(curl_error($ch));  //        
    curl_close($ch);
    return $ret;
}

URLアドレスがhttpヘッダであればSSL、そうでなければ普通のHTTPプロトコルです.
HTTPSで行くかどうかは安全ですか?実際にはSSLにも異なる検証レベルがあります.
たとえば、証明書の共通名を検証する必要はありますか?(BTW:Common Name)一般的には、SSL証明書を申請するドメイン名(domain)またはサブドメイン名(sub domain)を記入します.)
ホスト名を確認する必要がありますか?
どんな証明書でも信頼できるのか、それともCAが発行したものだけを信頼しているのか.
サイトSSL証明書がCA(通常は高い)を購入した場合、アクセス時に厳しい認証を使用することができます.
コードは次のとおりです.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);//CAが発行した証明書のみを信頼する
curl_setopt($ch, CURLOPT_CAINFO, $cacert);//CAルート証明書(検証用サイト証明書がCA発行であるか否か)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//証明書にドメイン名を設定し、指定したホスト名と一致するかどうかを確認します.
サイトの証明書が自分で生成された場合、またはネット上の小さな機関が申請した場合、アクセス時に厳格な認証を使用すると合格せず、falseに直接戻ります.(ところでfalseに戻るとcurl_error($ch)を印刷して特定のエラー情報を表示できます.)次のように、状況に応じて検証の程度を下げることで、通常のアクセスを保証できます.
コードは次のとおりです.
2 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
証明書にドメイン名が設定されているかどうかを確認します(0でもいいです.ドメイン名が存在するかどうかも検証されません).
普段、ブラウザを使って各httpsサイトにアクセスすると、証明書が信用されていないというヒントに遭遇することがありますが、これらのサイトの証明書は正規のCA機関が発行していないからです.
市販のブラウザにはCAルート証明書リスト情報が内蔵されており、CAが発行した証明書のあるサイトにアクセスすると、ルート証明書に基づいてこれらのサイトの証明書を検証するので、このヒントはありません.
CAルート証明書ファイルについては、ウェブサイトの証明書がこれらの機関から発行するかどうかを検証するために、各主要CA機関の公開鍵証明書が含まれている.
ソース:http://www.526net.com/blog/qianduan/353.html