【问题标题】:Trying to connect SSL server using fsockopen()尝试使用 fsockopen() 连接 SSL 服务器
【发布时间】:2021-03-08 15:20:41
【问题描述】:

我正在从本地主机和生产服务器运行下一个脚本,并且得到不同的输出。任何人都知道为什么我会从本地主机获得false

<?php
$host = 'ssl://mail.companyname.org';
$port = 993;
$error = 0;
$errorString = "";

var_dump(fsockopen($host, $port, $error, $errorString, 30));
var_dump($errorString);
var_dump($error);

本地主机输出:

布尔(假)

生产服务器输出:

类型(流)的资源(4)

更新:在 cmets/answer 之后我修改了代码,现在我在本地主机上得到了这个输出:

PHP 警告:fsockopen():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败 /tmp/test.php 在第 7 行 PHP 警告:fsockopen():启用失败 第 7 行 /tmp/test.php 中的加密 PHP 警告:fsockopen():无法 连接到 /tmp/test.php 中的 ssl://mail.twmdata.org:993(未知错误) 在第 7 行 bool(false) string(0) "" int(0)

【问题讨论】:

  • 看起来您的本地服务器不允许在服务端使用。检查防火墙和其他配置
  • 可能在这里说明了明显的情况,但$errorString 可能包含一些有用的信息。你没有提到任何关于它的事情。它说什么?
  • @RoAchterberg $errorString 为空。
  • "certificate verify failed" 正如@brensnap 已经指出的那样,您没有在本地主机上正确配置OpenSSL settings。查看生产服务器上的 php.ini 文件。
  • 有什么更新吗?需要帮助吗?您的 SSL 证书已于 4 天前过期。

标签: php php-5.6 fsockopen


【解决方案1】:

这似乎是服务器证书的问题:

首先您可以通过以下方式检查您的服务器证书及其链是否有效:

https://www.sslshopper.com/ssl-checker.htm

如果 ssl-checker 出现问题?

  • 您可以尝试在 companyname.org

    中更正 SSL 证书配置

    如果你成功并且错误仍然存​​在?

    1. 您必须手动添加证书文件

如果您有自签名证书:

  1. 您必须手动添加证书文件

如果您没有证书,也不关心中间人攻击, 您仍然可以在没有证书的情况下使用 SSL。

  1. 关闭 php fsock 证书检查(不推荐)

建议至少有一个自签名的证书。如果您有自签名,请尝试 1 解决方案。

我找到了问题

您在 PHP 警告日志中暴露了您的 域名,因此我检查了您的域 SSL。

在我使用此工具检查贵公司的域证书后:

https://www.sslshopper.com/ssl-checker.html#hostname=twmdata.org

您的证书有 2 个错误:

  • 此证书已过期(0 天前)。立即续订。

  • 证书中没有一个通用名称与输入的名称 (twmdata.org) 匹配。在网络浏览器中访问此站点时,您可能会收到错误消息。

看来您必须先更新证书

更新:

我发现这个答案可能有帮助

https://stackoverflow.com/a/40962061/9287628

建议使用

stream_context_create(['ssl' => [
   'ciphers' => 'RC4-MD5'
]])

@ChrisHaas 建议与 stream_context_createstream_socket_client 连接,如果您想指定证书目录或关闭证书检查,您将有很多选择。

【讨论】:

  • 我认为这是一个很好的起点。获取 Letsencrypt 证书以启动 https 连接更容易。 ssllabs.com/ssltest 也是测试证书的好地方。
【解决方案2】:

根据documentationfsockopen

stream_socket_client() 函数类似,但提供了更丰富的选项集,包括非阻塞连接和提供流上下文的能力。

基本上,fsockopen 非常低级,但没有很多选项,或者可以说是“合理的默认值”。

相反,您可以切换到stream_socket_client,这将允许您指定context 作为最后一个参数,并且该对象有许多选项,包括带有dozen options specific to SSL 的专用选项。从这个函数创建的对象与fwrite 和其他函数兼容,所以它应该做你希望做的一切。

$context = stream_context_create([/*Options here*/]);
$connection = stream_socket_client($host, $errno, $errorString, 30, null, $context);

现在,您应该使用哪些选项?

最糟糕的选择可能是verify_peer。我说“最糟糕”是因为你抛弃了 SSL/TLS 的可验证性部分,只将其用于加密,这样做会使你容易受到中间人攻击。不过,这是有时间和地点的,所以如果其他选项太复杂,您可以尝试一下。

$context = stream_context_create(['ssl' => ['verify_peer' => false]]);
$connection = stream_socket_client($host, $errno, $errorString, 30, null, $context);

相反,我建议使用 cafilecapath 做同样的事情,除了前者用于文件,而后者用于目录。

$context = stream_context_create(['ssl' => ['verify_peer' => true, 'cafile' => '/path/to/file']]);
$connection = stream_socket_client($host, $errno, $errorString, 30, null, $context);

您应该使用什么证书?我们使用this library定期拉取最近的CA文件,非常方便。每个项目都有一些设置,但是一旦你得到它,它就会很快。请参阅this 以在众所周知的位置提取 CA 文件。

最后一个选项是local_cert,如果您有权访问,您可以将其与保存来自服务器的证书和私钥的 PEM 文件一起使用。

编辑

mail.twmdata.org:993 上的证书与其他人谈论的 Web 服务器证书不同,这通常是最佳实践。您可以使用以下方法检查该证书:

openssl s_client -connect mail.twmdata.org:993 -servername mail.twmdata.org

如果你这样做,你会看到服务器有一个自签名证书,你可以通过将 verify_peer 选项设置为 false 来绕过它。

【讨论】:

    【解决方案3】:

    删除@符号。您正在隐藏可能会告诉您问题所在的错误消息。您还应该在 fsockopen() 的 errorno 参数中设置一个变量并回显它以进行调试。

    我的猜测是您没有在本地服务器上安装支持 SSL 的 PHP。见here

    Companyname.org 也可能会阻止来自本地服务器的请求,而这些请求允许来自生产服务器。

    【讨论】:

    • 看起来我有支持 SSL 的 PHP:php -i | grep -i openssl openssl OpenSSL support =&gt; enabled OpenSSL Library Version =&gt; OpenSSL 1.1.1g 21 Apr 2020 OpenSSL Header Version =&gt; OpenSSL 1.1.1g 21 Apr 2020 Openssl default config =&gt; /usr/lib/ssl/openssl.cnf openssl.cafile =&gt; no value =&gt; no value openssl.capath =&gt; no value =&gt; no value Native OpenSSL support =&gt; enabled
    • 看起来 PHP 没有正确的 SSL 证书。确保它们已安装并且名为 openssl.cafile 的 php.ini 设置指向正确的文件夹。如果您需要证书,您可以从letsencrypt.org/certificates 下载它们。另一个错误是您机器上的时间和日期是否错误。
    猜你喜欢
    • 2013-04-23
    • 2012-02-21
    • 2016-06-04
    • 2018-07-05
    • 2017-08-17
    • 1970-01-01
    • 2015-05-28
    • 2013-03-14
    • 2018-12-12
    相关资源
    最近更新 更多