openssl_peer_fingerprint_basic.phpt 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. --TEST--
  2. Testing peer fingerprint on connection
  3. --SKIPIF--
  4. <?php
  5. if (!extension_loaded("openssl")) die("skip openssl not loaded");
  6. if (!function_exists("proc_open")) die("skip no proc_open");
  7. ?>
  8. --FILE--
  9. <?php
  10. $certFile = __DIR__ . DIRECTORY_SEPARATOR . 'openssl_peer_fingerprint_basic.pem.tmp';
  11. $cacertFile = __DIR__ . DIRECTORY_SEPARATOR . 'openssl_peer_fingerprint_basic-ca.pem.tmp';
  12. $serverCode = <<<'CODE'
  13. $serverUri = "ssl://127.0.0.1:64321";
  14. $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
  15. $serverCtx = stream_context_create(['ssl' => [
  16. 'local_cert' => '%s'
  17. ]]);
  18. $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
  19. phpt_notify();
  20. @stream_socket_accept($server, 1);
  21. @stream_socket_accept($server, 1);
  22. CODE;
  23. $serverCode = sprintf($serverCode, $certFile);
  24. $peerName = 'openssl_peer_fingerprint_basic';
  25. $clientCode = <<<'CODE'
  26. $serverUri = "ssl://127.0.0.1:64321";
  27. $clientFlags = STREAM_CLIENT_CONNECT;
  28. $clientCtx = stream_context_create(['ssl' => [
  29. 'verify_peer' => true,
  30. 'cafile' => '%s',
  31. 'capture_peer_cert' => true,
  32. 'peer_name' => '%s',
  33. ]]);
  34. phpt_wait();
  35. stream_context_set_option($clientCtx, 'ssl', 'peer_fingerprint', '%s');
  36. var_dump(stream_socket_client($serverUri, $errno, $errstr, 2, $clientFlags, $clientCtx));
  37. stream_context_set_option($clientCtx, 'ssl', 'peer_fingerprint', [
  38. 'sha256' => '%s',
  39. ]);
  40. var_dump(stream_socket_client($serverUri, $errno, $errstr, 2, $clientFlags, $clientCtx));
  41. CODE;
  42. include 'CertificateGenerator.inc';
  43. $certificateGenerator = new CertificateGenerator();
  44. $certificateGenerator->saveCaCert($cacertFile);
  45. $certificateGenerator->saveNewCertAsFileWithKey($peerName, $certFile);
  46. $actualMd5 = $certificateGenerator->getCertDigest('md5');
  47. $lastCharacter = substr($actualMd5, -1, 1);
  48. $brokenLastCharacter = dechex(hexdec($lastCharacter) ^ 1);
  49. $brokenMd5 = substr($actualMd5, 0, -1) . $brokenLastCharacter;
  50. $actualSha256 = $certificateGenerator->getCertDigest('sha256');
  51. $clientCode = sprintf($clientCode, $cacertFile, $peerName, $brokenMd5, $actualSha256);
  52. include 'ServerClientTestCase.inc';
  53. ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
  54. ?>
  55. --CLEAN--
  56. <?php
  57. @unlink(__DIR__ . DIRECTORY_SEPARATOR . 'openssl_peer_fingerprint_basic.pem.tmp');
  58. @unlink(__DIR__ . DIRECTORY_SEPARATOR . 'openssl_peer_fingerprint_basic-ca.pem.tmp');
  59. ?>
  60. --EXPECTF--
  61. Warning: stream_socket_client(): peer_fingerprint match failure in %s on line %d
  62. Warning: stream_socket_client(): Failed to enable crypto in %s on line %d
  63. Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d
  64. bool(false)
  65. resource(%d) of type (stream)