Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable HTTPS stream wrappers

Tags:

I installed php5 on my windows system and tried to execute the following script with a command-line console:

<?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; 

But it says that it's unable to find the wrapper "https" and asks if I forget to enable it when I configured PHP.

What is the problem and how to settle it?

like image 800
Tamppox Avatar asked Feb 21 '10 13:02

Tamppox


People also ask

How to enable https wrapper in php?

Enable (uncomment the line extension=php_openssl. dll ) in your php. ini file. This will solve the issue.

What is a stream wrapper?

A wrapper is additional code which tells the stream how to handle specific protocols/encodings. For example, the http wrapper knows how to translate a URL into an HTTP/1.0 request for a file on a remote server.

What protocols does PHP support?

Supported Protocols and Wrappers ¶ PHP comes with many built-in wrappers for various URL-style protocols for use with the filesystem functions such as fopen(), copy(), file_exists() and filesize(). In addition to these wrappers, it is possible to register custom wrappers using the stream_wrapper_register() function.


2 Answers

1: Check which wrappers are installed.

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

2: If you dont see "https" on the list, add to/uncomment from php.ini

extension=php_openssl.dll 

Restart your server*, and your done.

*if server fails to restart go download php_openssl.dll from someplace and stick it in your extensions directory defined in the php.ini file, restart server, say a few hell mary's and pray.

like image 186
Drew Avatar answered Sep 21 '22 07:09

Drew


The file_get_contents line, at the end of your script, is trying to send an HTTPS request -- see the URL in $req, which starts by 'https://ec2...'.

For this to be possible, PHP needs a "wrapper" to send HTTPS requests -- which doesn't seem to be installed on your system ; which means you cannot send HTTPS requests using the fopen familly of functions.

For more informations about stream wrappers, if you are curious, you can take a look at List of Supported Protocols/Wrappers, and, in your case, HTTP and HTTPS.

You'll either have to install the HTTPs wrapper -- on Windows, I have no idea how to do that, unfortunately...


Or you'll have to use something else that file_get_contents to send your HTTPS request -- I would use the functions provided by the curl extension (Here, too, not sure it will work "out of the box", though :-( ).

For an example, you can take a look at what's proposed on the manual page of 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); 

Note you'll probably have to set a couple more options, using curl_setopt -- you should go through that page : there are a lot of useful options ;-)


As a sidenote, you are using this line at the beginning of your script :

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

The path /etc/aws.conf feels strange, as you said you are using a Windows system : this looks like the kind of path one would use on an UNIX/Linux system.

like image 23
Pascal MARTIN Avatar answered Sep 21 '22 07:09

Pascal MARTIN