Подтвердить что ты не робот

OPENSSL file_get_contents(): Не удалось включить криптографию

Я создаю личную складскую платформу (не распределенную). Компонент, который я хотел бы иметь, - это график 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.

fidelity https label

4b9b3361

Ответ 1

Хорошо, я нашел решение. Проблема в том, что сайт использует 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"));
?>

Когда вы устанавливаете версию SSL с curl на v3, тогда она работает.

Редактировать:

Еще одна проблема под Windows заключается в том, что у вас нет доступа к сертификатам. Поэтому ставьте корневые сертификаты прямо на завиток.

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 иначе вы получите сообщение об ошибке.

Ответ 2

Имела ту же проблему - она ​​была где-то в сертификате ca, поэтому я использовал пакет ca, используемый для завитки, и это сработало. Вы можете скачать комплект curl ca здесь: https://curl.haxx.se/docs/caextract.html

Вопросы шифрования и безопасности см. в этой полезной статье:
https://www.venditan.com/labs/2014/06/26/ssl-and-php-streams-part-1-you-are-doing-it-wrongtm/432

Вот пример:

    $url = 'https://www.example.com/api/list';
    $cn_match = 'www.example.com';

    $data = array (     
        'apikey' => '[example api key here]',               
        'limit' => intval($limit),
        'offset' => intval($offset)
        );

    // use key 'http' even if you send the request to https://...
    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',                
            'content' => http_build_query($data)                
            )
        , 'ssl' => array(
            'verify_peer' => true,
            'cafile' => [path to file] . "cacert.pem",
            'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:!SSLv3:!SSLv2',
            'CN_match' => $cn_match,
            'disable_compression' => true,
            )
        );

    $context  = stream_context_create($options);
    $response = file_get_contents($url, false, $context);

Надеюсь, что поможет

Ответ 3

Другим способом, который отлично работает, по крайней мере для отладки, является функция wget и exec(), как показано ниже.

exec('wget -O /local/destination/folder/filename.tar.gz www.domain.com/files/filename.tar.gz --no-check-certificate');

флаг "-no-check-certificate" выполняет любые проблемы с плохими сертификатами. Будьте осторожны с использованием этого метода в рабочей среде.