web-dev-qa-db-fra.com

OPENSSL file_get_contents (): Impossible d'activer le cryptage

Je construis une plate-forme d'actions personnelle (non distribuée). Un composant que j'aimerais avoir est le graphe EPS sur cette page:

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

Comme vous pouvez le constater, la page est https, donc après plusieurs jours d'efforts, j'ai activé openssl et maintenant, cela semble fonctionner pour toutes les pages https telles que les pages d'accueil. de Facebook et Twitter, cependant, il ne fonctionne toujours pas pour celui dont j'ai besoin.

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');

Je reçois l'avertissement:

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

La seule différence que je peux voir est que la page de fidélité a un triangle près de l'étiquette https.

fidelity https label

36
John Smith

Ok j'ai trouvé une solution. Le problème est que le site utilise SSLv3. Et je sais qu’il ya des problèmes dans le module openssl. Il y a quelque temps, j'ai eu le même problème avec les versions 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"));
?>

Lorsque vous définissez la version SSL avec curl sur v3, cela fonctionne.

Modifier:

Un autre problème sous Windows est que vous n’avez pas accès aux certificats. Mettez donc les certificats racine directement en boucle.

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

ici, vous pouvez télécharger les certificats racine.

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

Ensuite, vous pouvez utiliser le CURLOPT_SSL_VERIFYPEER option avec true sinon vous obtenez une erreur.

51
René Höhle

Il y avait le même problème - c'était quelque part dans le certificat de l'autorité de certification, alors j'ai utilisé le paquetage utilisé pour la boucle, et cela a fonctionné. Vous pouvez télécharger le package curl ca ici: https://curl.haxx.se/docs/caextract.html

Pour les problèmes de cryptage et de sécurité, consultez cet article utile:
https://www.venditan.com/labs/2014/06/26/ssl-and-php-streams-part-1-you-are-doing-it-wrongtm/432

Voici l'exemple:

    $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);

J'espère que ça t'as aidé

5
user7457877