web-dev-qa-db-fra.com

Comment activer les wrappers de flux HTTPS

J'ai installé php5 sur mon système Windows et essayé d'exécuter le script suivant avec une console de ligne de commande:

<?php
// load in credentials
$creds = parse_ini_file('/etc/aws.conf');

// Define query string keys/values
$params = array(
    'Action' => 'DescribeAvailabilityZones',
    'AWSAccessKeyId' => $creds['access_key'],
    'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
    'Version' => '2008-05-05',
    'ZoneName.0' => 'us-east-1a',
    'ZoneName.1' => 'us-east-1b',
    'ZoneName.2' => 'us-east-1c',
    'SignatureVersion' => 2,
    'SignatureMethod' => 'HmacSHA256'
);

// See docs
// http://tr.im/jbjd
uksort($params, 'strnatcmp');
$qstr = '';
foreach ($params as $key => $val) {
    $qstr .= "&{$key}=".rawurlencode($val);
}
$qstr = substr($qstr, 1);

// Signature Version 2
$str = "GET\n"
     . "ec2.amazonaws.com\n"
     . "/\n"
     . $qstr;

// Generate base64-encoded RFC 2104-compliant HMAC-SHA256
// signature with Secret Key using PHP 5's native 
// hash_hmac function.
$params['Signature'] = base64_encode(
    hash_hmac('sha256', $str, $creds['secret_key'], true)
);

// simple GET request to EC2 Query API with regular URL 
// encoded query string
$req = 'https://ec2.amazonaws.com/?' . http_build_query(
    $params
);
$result = file_get_contents($req);

// do something with the XML response
echo $result;

Mais il dit qu'il est impossible de trouver le wrapper "https" et me demande si j'oublie de l'activer lorsque j'ai configuré PHP. 

Quel est le problème et comment le résoudre?

16
Tamppox

1: Vérifiez quels wrappers sont installés.

<?php var_dump(stream_get_wrappers()); ?>

2: Si vous ne voyez pas "https" dans la liste, ajoutez/décommentez-vous à partir de php.ini

extension=php_openssl.dll

Redémarrez votre serveur *, et votre terminé.

* si le serveur ne parvient pas à redémarrer, allez télécharger php_openssl.dll quelque part et collez-le dans votre répertoire d'extensions défini dans le fichier php.ini, redémarrez le serveur, dites un peu, mary et faites l'amour.

39
Drew

La ligne file_get_contents, à la fin de votre script, tente d'envoyer une demande HTTPS - voir l'URL dans $req, qui commence par 'https://ec2...'.

Pour que cela soit possible, PHP a besoin d'un "wrapper" pour envoyer des requêtes HTTPS - qui ne semblent pas être installées sur votre système. ce qui signifie que vous ne pouvez pas envoyer de requêtes HTTPS à l'aide de la famille de fonctions fopen.

Pour plus d'informations sur les wrappers de flux, vous pouvez consulter Liste des protocoles/wrappers pris en charge et, dans votre cas, HTTP et HTTPS .

Vous devrez soit installer le wrapper HTTPs - sous Windows, je ne sais pas comment faire cela, malheureusement ...


Ou vous devrez utiliser quelque chose d'autre que file_get_contents pour envoyer votre demande HTTPS - J'utiliserais les fonctions fournies par le curl extension (Ici aussi, je ne suis pas sûr fonctionnera "hors de la boîte", cependant :-() .

Pour un exemple, vous pouvez regarder ce qui est proposé sur la page de manuel de curl_exec

// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// grab URL and pass it to the browser
curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);

Notez que vous devrez probablement définir quelques options supplémentaires, en utilisant curl_setopt - vous devriez passer par cette page: il y a beaucoup d'options utiles ;-)


En tant que note de bas de page, vous utilisez cette ligne au début de votre script:

$creds = parse_ini_file('/etc/aws.conf');

Le chemin /etc/aws.conf semble étrange, car vous avez dit que vous utilisez un système Windows: cela ressemble au type de chemin que vous utiliseriez sur un système UNIX/Linux.

10
Pascal MARTIN

Ouvrez php.ini. Trouvez cette ligne:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; ...
;extension=ext/php_oci8.dll
extension=ext/php_openssl.dll         ; <---- you want this
;extension=ext/php_pdo_firebird.dll
; ...

vous souhaitez supprimer la mise en commentaire de la ligne extension=ext/php_openssl.dll. Assurez-vous qu'il y a un fichier pho_openssl.dll dans le répertoire ext/, relatif à votre php.ini (ou peut-être plus important encore à la variable extension_dir dans l'ini).

3
n611x007

Simple. J'ai eu cette erreur et m'a donné de tels maux de tête. Activez (décommentez la ligne extension=php_openssl.dll) dans votre fichier php.ini. Cela résoudra le problème.

0
heinkasner