Skip to content

Commit 5b6b990

Browse files
committed
Add support for specific TLS versions.
We should allow people to specify TLS1.1 or 1.2 if they need it. Also work around a change in PHP >5.6.7 where TLS_CLIENT only allowed 1.0 and didn't allow clients to negotiate to higher versions of TLS.
1 parent 001504a commit 5b6b990

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

src/Network/Socket.php

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,16 @@ class Socket
9191
'sslv3_client' => STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
9292
'sslv23_client' => STREAM_CRYPTO_METHOD_SSLv23_CLIENT,
9393
'tls_client' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
94+
'tlsv10_client' => STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT,
95+
'tlsv11_client' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT,
96+
'tlsv12_client' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
9497
'sslv2_server' => STREAM_CRYPTO_METHOD_SSLv2_SERVER,
9598
'sslv3_server' => STREAM_CRYPTO_METHOD_SSLv3_SERVER,
9699
'sslv23_server' => STREAM_CRYPTO_METHOD_SSLv23_SERVER,
97-
'tls_server' => STREAM_CRYPTO_METHOD_TLS_SERVER
100+
'tls_server' => STREAM_CRYPTO_METHOD_TLS_SERVER,
101+
'tlsv10_server' => STREAM_CRYPTO_METHOD_TLSv1_0_SERVER,
102+
'tlsv11_server' => STREAM_CRYPTO_METHOD_TLSv1_1_SERVER,
103+
'tlsv12_server' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER
98104
// @codingStandardsIgnoreEnd
99105
];
100106

@@ -431,8 +437,23 @@ public function enableCrypto($type, $clientOrServer = 'client', $enable = true)
431437
if (!array_key_exists($type . '_' . $clientOrServer, $this->_encryptMethods)) {
432438
throw new InvalidArgumentException('Invalid encryption scheme chosen');
433439
}
440+
$method = $this->_encryptMethods[$type . '_' . $clientOrServer];
441+
442+
// Prior to PHP 5.6.7 TLS_CLIENT was any version of TLS. This was changed in 5.6.7
443+
// to fix backwards compatibility issues, and now only resolves to TLS1.0
444+
//
445+
// See https://github.com/php/php-src/commit/10bc5fd4c4c8e1dd57bd911b086e9872a56300a0
446+
if (version_compare(PHP_VERSION, '5.6.7', '>=')) {
447+
if ($method == STREAM_CRYPTO_METHOD_TLS_CLIENT) {
448+
$method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
449+
}
450+
if ($method == STREAM_CRYPTO_METHOD_TLS_SERVER) {
451+
$method |= STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER;
452+
}
453+
}
454+
434455
try {
435-
$enableCryptoResult = stream_socket_enable_crypto($this->connection, $enable, $this->_encryptMethods[$type . '_' . $clientOrServer]);
456+
$enableCryptoResult = stream_socket_enable_crypto($this->connection, $enable, $method);
436457
} catch (Exception $e) {
437458
$this->setLastError(null, $e->getMessage());
438459
throw new SocketException($e->getMessage());

tests/TestCase/Network/SocketTest.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,19 +374,30 @@ public function testEnableCryptoExceptionEnableTwice()
374374
*/
375375
public function testEnableCryptoExceptionDisableTwice()
376376
{
377-
// testing on tls server
378377
$this->_connectSocketToSslTls();
379378
$this->Socket->enableCrypto('tls', 'client', false);
380379
}
381380

381+
/**
382+
* testEnableCryptoEnableStatus
383+
*
384+
* @return void
385+
*/
386+
public function testEnableCryptoEnableTls12()
387+
{
388+
$this->_connectSocketToSslTls();
389+
$this->assertFalse($this->Socket->encrypted);
390+
$this->Socket->enableCrypto('tlsv12', 'client', true);
391+
$this->assertTrue($this->Socket->encrypted);
392+
}
393+
382394
/**
383395
* testEnableCryptoEnableStatus
384396
*
385397
* @return void
386398
*/
387399
public function testEnableCryptoEnableStatus()
388400
{
389-
// testing on tls server
390401
$this->_connectSocketToSslTls();
391402
$this->assertFalse($this->Socket->encrypted);
392403
$this->Socket->enableCrypto('tls', 'client', true);

0 commit comments

Comments
 (0)