【发布时间】:2012-07-09 03:25:36
【问题描述】:
我正在尝试在 Node 中编写一个支持具有显式 AUTH 的 TLS 的 FTP 服务器。在这种模式下,客户端向服务器发送AUTH TLS 命令,服务器以确认响应,提示客户端开始协商安全连接。
我正在使用此代码升级连接:https://github.com/andris9/rai/blob/master/lib/starttls.js。我通过使用 net.Server 编写一个简单的 echo 服务器,然后使用 starttls 函数立即将套接字升级到安全连接来验证这是否有效。使用openssl s_client 连接到此测试服务器按预期工作。
但是,当我尝试使用支持具有显式身份验证的 TLS 的 FTP 客户端连接到我的测试 FTP 服务器时,createSecurePair 返回的对象引发以下异常:
[Error: 140735236446560:error:1408A0B7:SSL routines:SSL3_GET_CLIENT_HELLO:no ciphers
specified:../deps/openssl/openssl/ssl/s3_srvr.c:1009:
]
我实际上已经指定了密码(createSecurePair 传递了一个 options dict,ciphers 设置为 'RC4-SHA:AES128-SHA:AES256-SHA')。我已经对连接进行了数据包嗅探,似乎发生的情况是,在服务器响应客户端的AUTH TLS 命令后,客户端和服务器之间进行了短暂的交换,我认为这是(失败的)TLS 协商。但我对 TLS 的了解还不够深入,无法进一步调查。我应该如何着手调查这个错误的来源?
我正在运行节点 0.8.1,并且在 0.6.19 上遇到了同样的问题。
【问题讨论】:
-
该错误清楚地表明客户端Hello中没有发送密码。您可以尝试使用 ethreal 将数据包解码为 SSL,并尝试查看您发送的 Client Hello 数据包中是否存在密码。
-
这很奇怪,因为我的程序是服务器,而不是客户端,而且我已经尝试了几个 FTP 客户端。在这方面,他们似乎都不太可能出现问题。 (除非 TLS 客户端/服务器术语与我的预期不同?)感谢您的空灵建议。
-
似乎 FTP 客户端正在发送正确的 Client Hello 消息,但服务器从未以 Server Hello 响应。所以我的代码中一定有一个错误。很难弄清楚在哪里,因为升级连接的代码是已知的。