【问题标题】:fsockopen errors with SSLSSL 的 fsockopen 错误
【发布时间】:2018-06-24 14:41:58
【问题描述】:

我正在尝试在 localhost 上使用 fsockopen,在 Windows 上使用 https,使用 Wamp。 它在 http 上运行良好,但在 https 上却不行。

我使用 OpenSSL (How to install: OpenSSL + WAMP) 创建了一个证书,并在 httpd-vhosts.conf 文件中声明了一个虚拟主机。

这是 PHP 代码:

$fp = fsockopen("ssl://localhost", 443, $errno, $errstr, FSOCKOPEN_TIMEOUT); // same pb with ssl://www.localhost

这会产生以下错误:

PHP Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
PHP Warning:  fsockopen(): Failed to enable crypto
PHP Warning:  fsockopen(): unable to connect to ssl://localhost:443 (Unknown error)

当 Apache 启动时,我的 ssl 错误日志文件中也有以下警告(我不知道是否可能相关):

[ssl:warn] [pid 6008:tid 596] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name

你知道我做错了什么吗?

谢谢!

【问题讨论】:

  • 我怀疑您的证书是针对名称“localhost”的,因此不匹配。
  • 谢谢帕特里克。我通过带有“通用名称(例如服务器 FQDN 或您的名称)[]:localhost”的证书重新生成。我没有 Apache 警告“localhost:443:0 服务器证书不包含与服务器名称匹配的 ID”,但我仍然有“SSL 操作失败”错误。

标签: php ssl https wamp


【解决方案1】:

请记住 - 如果您自己在本地创建 ssl 证书,它通常不受客户端(例如网络浏览器)的信任

当您完成证书创建过程时,系统会询问您有关通用名称 (CN) 的问题。那应该是您计划为您的网页提供服务的域,或者,当您仅在本地使用它时,它也可以是 localhost。 在您的情况下,您使用了与 apache 配置中的 ServerNameServerAlias 不匹配的东西。

Atm 我不明白您为什么要通过 ssl 连接到 localhost - 从安全角度来看,这并不是必需的。

否则您可能会强制您的客户端 (php) 不检查证书的有效性

<?php
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ]
]);
$fp = stream_socket_client("ssl://localhost", $errno, $errstr, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context);

但仅对本地连接执行此操作 (!)

【讨论】:

  • 感谢 Evil_skunk。我通过 SSL 连接到 localhost 以在与生产环境相同的条件下在本地测试我的网站(我想确保它在部署之前在本地运行良好)。它与 stream_socket_client 确实有效(我只需要在您的代码中将端口添加到主机 ($fp = stream_socket_client("ssl://localhost:443", $errno, $errstr, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context);) 但是我希望理想情况下在本地和生产中使用相同的代码。
  • 但是您总是会收到 ssl 错误(验证错误),因为您的自签名证书不是公开有效的。还有另一种选择 - 如果您创建一个在本地系统上受信任的根证书并用这个证书签署您的证书,它应该可以工作(例如medium.freecodecamp.org/…)。但我认为这太过分了——我只会让我的代码可配置,基本上不会在“测试模式”下检查证书有效性
猜你喜欢
  • 2016-04-06
  • 2015-07-23
  • 1970-01-01
  • 2011-07-26
  • 2011-07-26
  • 2013-03-14
  • 2010-12-11
  • 2015-03-30
相关资源
最近更新 更多