【问题标题】:How to make fsockopen to ignore certificates when using tls使用 tls 时如何使 fsockopen 忽略证书
【发布时间】:2017-01-30 11:04:45
【问题描述】:

在 PHP7.0 中,使用 fsockopen 连接时打开一个 https 连接(托管在同一 主机),使用像 tls://foo.localhost 这样的主机名,我收到一个错误 看起来像

fsockopen(): Peer certificate CN="bar" did not match expected CN="foo.localhost"

连接未打开。

相同的代码在 PHP 5.5 中工作(即检查验证不那么严格)。我愿意 并不真正关心验证证书(此代码在单元测试中运行,并且 集成套件,仅连接到本地主机)。测试需要针对 不过,http 和 https。

我知道在使用file_get_contents 时如何禁用这些检查。

使用 fsockopen 时如何禁用对等证书验证?

【问题讨论】:

  • verify_peer context option 会影响这个吗?
  • @ÁlvaroGonzález,我不知道如何将上下文传递给fsockopen
  • 从未使用过套接字,我认为stream_context_set_default() 应该可以工作。如果没有,请尝试fsockopen() 手册页中建议的函数:“函数stream_socket_client() 类似,但提供了更丰富的选项集,包括非阻塞连接和提供流上下文的能力。”跨度>
  • @ÁlvaroGonzález,context_set_default 不适用于fsockopen。很可能stream_socket_client 是要走的路(我很不情愿,因为fsockopen 它是我需要使用的不是很现代的测试库的核心)。感谢您指出。

标签: php ssl


【解决方案1】:

fsockopen 不提供忽略对等证书错误的方法。

您必须将stream_socket_clientcontext 一起使用。可用的 ssl/tls 上下文选项可用here

打开套接字而不进行对等验证的示例

$context = stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ]
]);

$hostname = "tls://foo.localhost:8123";
$socket = stream_socket_client($hostname, $errno, $errstr, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context);

【讨论】:

  • 正确并且选项 'verify_peer_name' => false 可能是必要的,以防一些奇怪的 DEV 主机名。
  • 如何使用stream_socket_client而不是fsockopen来指定端口?
  • @ShadiNamrouti 您可以在 $hostname 中包含端口,例如$hostname = "tls://foo.localhost:8123";
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 2016-08-08
  • 2013-08-06
  • 2012-08-18
  • 2021-08-16
  • 1970-01-01
  • 2010-11-21
  • 2014-06-08
相关资源
最近更新 更多