diff --git a/ext/openssl/tests/bug74796.phpt b/ext/openssl/tests/bug74796.phpt index b3f594d5e60f4..c16be7c0cbc33 100644 --- a/ext/openssl/tests/bug74796.phpt +++ b/ext/openssl/tests/bug74796.phpt @@ -34,6 +34,21 @@ $serverCode = <<<'CODE' phpt_wait(); CODE; +$serverCode2 = <<<'CODE' + $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + + $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $serverFlags, null); + phpt_notify_server_start($server); + + for ($i=0; $i < 3; $i++) { + $conn = stream_socket_accept($server, 3); + fwrite($conn, "HTTP/1.0 200 OK\r\n\r\nHello from server $i"); + fclose($conn); + } + + phpt_wait(); +CODE; + $proxyCode = <<<'CODE' function parse_sni_from_client_hello($data) { $sni = null; @@ -156,17 +171,43 @@ $clientCode = <<<'CODE' phpt_notify('server'); CODE; +$clientCode2 = <<<'CODE' + $clientCtx = stream_context_create([ + 'ssl' => [ + 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'verify_peer' => true, + 'verify_peer_name' => true, + ], + "http" => [ + "proxy" => "tcp://{{ ADDR }}" + ], + ]); + + // servers + var_dump(file_get_contents("https://test.php.net/", false, $clientCtx)); + var_dump(stream_context_get_options($clientCtx)['ssl']['peer_name'] ?? null); + phpt_notify('proxy'); + + echo file_get_contents(__DIR__ . "/bug74796_proxy_sni.log"); + + phpt_notify('server'); +CODE; + include 'ServerClientTestCase.inc'; ServerClientTestCase::getInstance()->run($clientCode, [ 'server' => $serverCode, 'proxy' => $proxyCode, ]); +ServerClientTestCase::getInstance()->run($clientCode2, [ + 'server' => $serverCode2, + 'proxy' => $proxyCode, +]); ?> --CLEAN-- ---EXPECT-- +--EXPECTF-- string(19) "Hello from server 0" NULL string(19) "Hello from server 1" @@ -176,3 +217,14 @@ NULL cs.php.net uk.php.net us.php.net + +Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: +error:%s:SSL routines::ssl/tls alert handshake failure in %sServerClientTestCase.inc(%d) : eval()'d code on line %d + +Warning: file_get_contents(https://test.php.net/): Failed to open stream: Cannot connect to HTTPS server through proxy in %sServerClientTestCase.inc(%d) : eval()'d code on line %d +bool(false) +string(12) "test.php.net" +cs.php.net +uk.php.net +us.php.net +test.php.net \ No newline at end of file diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 040ee4eabf78b..064f1e5de0516 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -575,7 +575,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, } } - if (reset_ssl_peer_name) { + if (stream && reset_ssl_peer_name) { php_stream_context_unset_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_name"); } }