1. ホーム
  2. php

[解決済み] OPENSSL file_get_contents(): 暗号の有効化に失敗しました

2022-02-08 08:34:18

質問

個人向けの株式プラットフォームを構築しています(配布はしていません)。このページのEPSグラフのようなコンポーネントが欲しいのですが。

https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes

ご覧のように、このページは https ということで、何日もかけて打ち合わせをした後、有効化しました。 openssl に対応し、すべての https のページ、例えばfacebookやtwitterのトップページなどでは動作していますが、私が必要としているページではまだ動作していません。

file_get_contents('https://facebook.com'); /* works */
file_get_contents('https://twittercom'); /* works */
file_get_contents('https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes');

警告が表示されるのですが。

Warning: file_get_contents(): SSL: crypto enabling timeout in C:\xampp\htdocs\index.php on line 3
Warning: file_get_contents(): Failed to enable crypto in C:\xampp\htdocs\index.php on line 3
Warning: file_get_contents(https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes): failed to open stream: operation failed in C:\xampp\htdocs\index.php on line 3
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\index.php on line 3

私が見ることができる唯一の違いは、フィデリティページのhttpsラベルの近くに三角形があることです。

解決方法は?

OK 解決策を見つけました。問題は、サイトがSSLv3を使用していることです。そして、私はopensslモジュールにいくつかの問題があることを知っています。少し前に、私はSSLバージョンで同じ問題を抱えていました。

<?php
function getSSLPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSLVERSION,3); 
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

var_dump(getSSLPage("https://eresearch.fidelity.com/eresearch/evaluate/analystsOpinionsReport.jhtml?symbols=api"));
?>

curlでSSL Versionをv3にするとうまくいきます。

編集する

Windowsでのもう一つの問題は、証明書にアクセスできないことです。だから、ルート証明書を直接curlに入れる。

http://curl.haxx.se/docs/caextract.html

ルート証明書のダウンロードはこちらから。

curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/certs/cacert.pem");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

そうすると CURLOPT_SSL_VERIFYPEER オプションで true を指定しないとエラーになります。