【问题标题】:PHP socket server that uses ADH. How?使用 ADH 的 PHP 套接字服务器。如何?
【发布时间】:2013-08-15 15:08:59
【问题描述】:

我正在尝试使用stream_socket_server() 创建一个套接字服务器。

正常连接工作正常,但我想制作一个无需证书即可加密连接的服务器。我知道这可以使用 ADH 密码来完成,是的,我知道它在理论上不如使用证书安全...

我首先制作这个服务器的原因是为了模拟一个客户端连接到的不同服务器(如果你想知道,通过this protocol)。

客户端被配置为首先请求证书,然后回退到 ADH - 我已经用真实的东西对其进行了测试,它连接没有问题,所以问题出在套接字服务器上。

到目前为止,我所做的一切都导致了“握手失败”错误。

我尝试过的一些配置:

<?php
$server = stream_socket_server(
        "tls://127.0.0.1:6667",
        $errorno,
        $errstr,
        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
        stream_context_create(
            array('ssl' => array('ciphers' => 'ADH'))
        )
    );
?>

<?php
$server = stream_socket_server(
        "tls://127.0.0.1:6667",
        $errorno,
        $errstr,
        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
        stream_context_create(
            array('ssl' => array('ciphers' => '-COMPLEMENTOFALL ADH'))
        )
    );
?>

我还尝试将客户端调整为无条件使用 ADH(如上面的第二个示例),只是为了测试,但这也失败了。

我尝试过的每个 PHP 版本都会出现这种情况,其中最新的是 5.5.0。

有什么想法吗?

【问题讨论】:

标签: php sockets ssl


【解决方案1】:

我会使用 Wireshark 之类的工具来检查通过网络传输的位,这样我就可以准确地确定握手出了什么问题。如果没有这种能力,您将盲目飞行(或调试)。

一旦你知道你的握手出了什么问题,你就可以找出“为什么”。

【讨论】:

  • 出于某种原因,Wireshark 不会捕获从我的计算机返回到自身的流量。即使我用计算机的(公共)IP 替换“127.0.0.1”也是如此。我会尝试设置第二台计算机,看看是否可以解决问题...
  • 原始字节可以在这里看到gist.github.com/boenrobot/6331636 至于 Wireshark 是如何解码的——hello 数据包只包含 ADH 密码(正如本次特定测试所预期的那样),服务器回复“握手失败” (40)"。
  • 哦,在客户端,显示以下错误消息:“error:14094410:SSLroutines:SSL3_READ_BYTES:sslv3 alert handshake failure”。 (奇怪......我在两个节点上都使用 TLS,而不是 SSLv3)
【解决方案2】:

首先检查您的服务器中的 SSL 设置是否正确? Run SSL Scanner 在服务中。我有一个根本不起作用的测试脚本,因为 OpenSSL 调用在没有密钥文件的情况下无法运行。这不是答案,但我没有时间进行更多调查......

您知道 ADH 是一种弱加密吗? ~ 大多数安全建议都建议将其关闭。关于ADH的一般阅读http://wiki.openssl.org/index.php/Manual:Ciphers(1)

【讨论】:

  • 是的。正如我在顶部所说,我知道 ADH 不如与证书的连接安全,并且我正在尝试创建一个服务器作为单元测试中的模拟,而不是用于“生产”使用。当服务器没有证书时,真实服务器支持 ADH 作为替代方案。至于 SSLScan ......我运行了the Windows port of SSLScan,在稍微调整脚本到 stream_socket_accept() 之后,即使失败了,我也看到所有密码都“被拒绝”,服务器发回与前面提到的完全相同的数据包。跨度>
  • 顺便说一句,有趣的事情要注意......使用上面的测试服务器,我只得到 TLSv1 和 SSLv3 密码为“拒绝”,而 SSLv2 为“失败”。当我将一个空文件作为“local_cert”上下文选项放置时,我还将 SSLv2 密码设置为“Rejected”。
  • 空的本地证书...我希望如此。因为这是从安全的角度编写的;空文件与拒绝所有人的无效证书相同。
  • 如果我所做的一切都完成了;我会在星期二花更多时间。
猜你喜欢
  • 2012-07-02
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2012-01-22
相关资源
最近更新 更多