この記事では主に、PHP で CURL を使用して HTTPS にアクセスする方法を説明します。これが皆さんのお役に立てれば幸いです。
説明の便宜上、コードから始めましょう~これは今日再カプセル化された関数です
/** * 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アドレスがhttpsで始まる場合はSSLを使用し、それ以外の場合は通常のHTTPプロトコルを使用します。
HTTPS を使用しても安全ですか?実際、SSL にもさまざまなレベルの検証があります。
たとえば、証明書内の共通名を確認する必要がありますか? (ちなみに、コモンネームとは一般に、SSL証明書を申請するドメイン名(ドメイン)またはサブドメイン名(サブドメイン)を入力することを意味します。)
ホスト名を確認する必要がありますか?
どの証明書も信頼しますか、それとも 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); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
Web サイトの証明書が独自に生成されている場合、または小規模なオンライン組織によって適用されている場合、アクセス中に厳密な認証が使用されている場合、認証は通過せず、直接 false が返されます。 (ちなみに、 false が返された場合は、curl_error($ch) を出力して、特定のエラー メッセージを表示できます。) このとき、正常なアクセスを確保するために、状況に応じて検証レベルを下げることができます。例:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 检查证书中是否设置域名(为0也可以,就是连域名存在与否都不验证了)
通常、ブラウザを使用してさまざまな https ウェブサイトにアクセスすると、証明書が信頼できないというプロンプトが表示されることがあります。これは、実際には、これらのウェブサイトの証明書が正式な CA 組織によって発行されていないためです。
市場のさまざまなブラウザには CA ルート証明書リスト情報が組み込まれており、CA が発行した証明書を持つ Web サイトにアクセスすると、これらの Web サイトの証明書はルート証明書に基づいて検証されるため、そのようなプロンプトは表示されません。
CA ルート証明書ファイルに関しては、実際には各主要な CA 組織の公開鍵証明書が含まれており、Web サイトの証明書がこれらの組織によって発行されたものであるかどうかを確認するために使用されます。
ここでのファイルは、mozilla のソース ツリーから派生し、PEM 形式の証明書ファイルに変換されます。 (既製の http://curl.haxx.se/ca/cacert.pem はここからダウンロードできます)
最後に、SSL とは関係のないことについて話しましょう:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
関連する推奨事項:
php を使用https サンプルコードにアクセスするためのcurl
以上がPHP で CURL を使用して HTTPS にアクセスするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。