Re: Re: Re: PHP Crypt functions - security audit
| From: | Daniel Lowrey | Date: | Thu, 19 Sep 2013 02:51:02 +0000 |
| Subject: | Re: Re: Re: PHP Crypt functions - security audit | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-69222@lists.php.net to get a copy of this message | ||
> While we're on the topic, it's actually worse than that. Even if you
> turn peer validation and name checking on, PHP can't handle
> subjectAltNames in certificates, which causes quite a few failures.
This is incorrect. PHP has supported both the "SNI_enabled" and
"SNI_server_name"
SSL context options since 5.3. Anything older than 5.3 is not remotely
worth worrying over. You can verify this for yourself using the following
code:
<?php
// reference: http://php.net/manual/en/context.ssl.php
$ctx = stream_context_create(['ssl' => [
'verify_peer' => TRUE,
'cafile' => '/path/to/cacert.pem', // <-- change to point to an actual
CA file
'SNI_enabled' => TRUE
]]);
$uri = https://sni.velox.ch/ // <--- A test site using SNI
certs
$result = file_get_contents($uri, FALSE, $ctx);
P.S. Thank you to whomever updated
http://php.net/manual/en/context.ssl.phpto
reflect the
"disable_compression" SSL stream context option (and
subsidized my laziness) :)
On Wed, Sep 18, 2013 at 9:06 PM, Tjerk Anne Meesters <datibbaw@php.net>wrote:
>
>
>
> On Thu, Sep 19, 2013 at 8:33 AM, Ángel González <keisial@gmail.com> wrote:
>
>> On 16/09/13 15:58, Daniel Lowrey wrote:
>>
>>> More generally, PHP's stream encryption aspects are quite poorly
>>> documented. For example, https:// streams disable peer
>>> verification by
>>> default. While I understand that this is necessary to provide the easiest
>>> possible user experience for things like `file_get_contents("
>>> https://somesite.com")`, it's also horribly
>>> insecure. 99% of people
>>> using
>>> tools like this won't know anything about this "feature" and won't
>>> realize
>>> that their stream transfers are totally vulnerable to Man-in-the-Middle
>>> attacks by default.
>>>
>> Count me as one of those that didn't know https://
>> streams didn't verify
>> certificates. :)
>> *I consider this a bug* I understand that it's easier to code not
>> verifying the
>> peer, and the hostname may not be available when you are stacking ssl
>> over a stream.
>> But file_get_contents("https://...**") is
>> *precisely* the case that
>> should work right
>> out of the box.
>
>
> To be practical, verifying certificates requires an up-to-date CA bundle
> to be shipped with PHP; perhaps this is a simple thing to do, I'm not sure.
> This is an oft seen scenario for cURL; the developer would see the
> certificate issue, search online and continue with `CURLOPT_VERIFY_PEER =>
> 0`. That said, at least cURL is configured to check the certificate by
> default.
>
>
>
>>
>>
>>
>>
>> --
>> PHP Internals - PHP Runtime Development Mailing List
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>>
>
>
> --
> --
> Tjerk
>