| 
 | 1 | +--TEST--  | 
 | 2 | +Bug #80770: SNI_server_certs does not inherit peer verification options  | 
 | 3 | +--EXTENSIONS--  | 
 | 4 | +openssl  | 
 | 5 | +--SKIPIF--  | 
 | 6 | +<?php  | 
 | 7 | +if (!function_exists("proc_open")) die("skip no proc_open");  | 
 | 8 | +if (OPENSSL_VERSION_NUMBER < 0x10101000) die("skip OpenSSL v1.1.1 required");  | 
 | 9 | +?>  | 
 | 10 | +--FILE--  | 
 | 11 | +<?php  | 
 | 12 | +$clientCertFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug80770_client.pem.tmp';  | 
 | 13 | +$caCertFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug80770_ca.pem.tmp';  | 
 | 14 | + | 
 | 15 | +$serverCode = <<<'CODE'  | 
 | 16 | +    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;  | 
 | 17 | +    $ctx = stream_context_create(['ssl' => [  | 
 | 18 | +        'SNI_server_certs' => [  | 
 | 19 | +            "cs.php.net" => __DIR__ . "/sni_server_cs.pem",  | 
 | 20 | +            "uk.php.net" => __DIR__ . "/sni_server_uk.pem",  | 
 | 21 | +            "us.php.net" => __DIR__ . "/sni_server_us.pem"  | 
 | 22 | +        ],  | 
 | 23 | +        'verify_peer' => true,  | 
 | 24 | +        'cafile' => '%s',  | 
 | 25 | +        'capture_peer_cert' => true,  | 
 | 26 | +        'verify_peer_name' => false,  | 
 | 27 | +        'security_level' => 0,  | 
 | 28 | +    ]]);  | 
 | 29 | +    $server = stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr, $flags, $ctx);  | 
 | 30 | +    phpt_notify_server_start($server);  | 
 | 31 | +
  | 
 | 32 | +    $client = stream_socket_accept($server, 30);  | 
 | 33 | +    if ($client) {  | 
 | 34 | +        $success = stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER);  | 
 | 35 | +        if ($success) {  | 
 | 36 | +            $options = stream_context_get_options($client);  | 
 | 37 | +            $hasCert = isset($options['ssl']['peer_certificate']);  | 
 | 38 | +            phpt_notify(message: $hasCert ? "CLIENT_CERT_CAPTURED" : "NO_CLIENT_CERT");  | 
 | 39 | +        } else {  | 
 | 40 | +            phpt_notify(message: "TLS_HANDSHAKE_FAILED");  | 
 | 41 | +        }  | 
 | 42 | +    } else {  | 
 | 43 | +        phpt_notify(message: "ACCEPT_FAILED");  | 
 | 44 | +    }  | 
 | 45 | +CODE;  | 
 | 46 | +$serverCode = sprintf($serverCode, $caCertFile);  | 
 | 47 | + | 
 | 48 | +$clientCode = <<<'CODE'  | 
 | 49 | +    $flags = STREAM_CLIENT_CONNECT;  | 
 | 50 | +    $ctx = stream_context_create(['ssl' => [  | 
 | 51 | +        'verify_peer' => false,  | 
 | 52 | +        'verify_peer_name' => false,  | 
 | 53 | +        'local_cert' => '%s',  | 
 | 54 | +        'peer_name' => 'cs.php.net',  | 
 | 55 | +        'security_level' => 0,  | 
 | 56 | +    ]]);  | 
 | 57 | +    $client = stream_socket_client("tcp://{{ ADDR }}", $errno, $errstr, 30, $flags, $ctx);  | 
 | 58 | +    if ($client) {  | 
 | 59 | +        stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);  | 
 | 60 | +    }  | 
 | 61 | +
  | 
 | 62 | +    $result = phpt_wait();  | 
 | 63 | +    echo trim($result);  | 
 | 64 | +CODE;  | 
 | 65 | +$clientCode = sprintf($clientCode, $clientCertFile);  | 
 | 66 | + | 
 | 67 | +include 'CertificateGenerator.inc';  | 
 | 68 | + | 
 | 69 | +// Generate CA and client certificate signed by that CA  | 
 | 70 | +$certificateGenerator = new CertificateGenerator();  | 
 | 71 | +$certificateGenerator->saveCaCert($caCertFile);  | 
 | 72 | +$certificateGenerator->saveNewCertAsFileWithKey('Bug80770 Test Client', $clientCertFile);  | 
 | 73 | + | 
 | 74 | +include 'ServerClientTestCase.inc';  | 
 | 75 | +ServerClientTestCase::getInstance()->run($clientCode, $serverCode);  | 
 | 76 | +?>  | 
 | 77 | +--CLEAN--  | 
 | 78 | +<?php  | 
 | 79 | +@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug80770_client.pem.tmp');  | 
 | 80 | +@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug80770_ca.pem.tmp');  | 
 | 81 | +?>  | 
 | 82 | +--EXPECTF--  | 
 | 83 | +CLIENT_CERT_CAPTURED  | 
0 commit comments