【问题标题】:How can I upgrade a socket to TLS in node?如何在节点中将套接字升级到 TLS?
【发布时间】: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 响应。所以我的代码中一定有一个错误。很难弄清楚在哪里,因为升级连接的代码是已知的。

标签: node.js ftp openssl ssl


【解决方案1】:

结果证明这是一个愚蠢的错误。我正在修改的 FTP 服务器代码使用了socket.setEncoding。当然,打开它会搞砸 TLS 协商。

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2017-02-25
    • 2018-10-20
    • 2018-09-27
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多