【问题标题】:Support SSL and non-SSL on the same port在同一端口上支持 SSL 和非 SSL
【发布时间】:2016-09-22 04:14:18
【问题描述】:

我正在努力将 SSL 支持添加到我们现有的应用程序中,并开始考虑向后兼容性。

与我读过的其他帖子不同的一个特殊情况是服务器可能不一定会使用 SSL 代码进行更新。所以我将有一个 SSL 客户端连接到一个对 SSL 一无所知的服务器。

为了便于讨论,应用程序一次向服务器发送一个击键,每次击键都会创建一个新的套接字。所以我需要想办法让这个在现有端口号上工作,而不是使用超时来确定服务器是否支持 SSL。

有什么优雅的处理方式的建议吗?

(我正在使用 Winsock 和 OpenSSL)

【问题讨论】:

  • 由于 SSL 是 TCP 之上的协议,因此它们总是在同一个端口上运行。
  • 糟糕。我用错了我的主题。固定。
  • 这里的数据不足。您需要考虑如何升级服务器,何时/如果发生。服务器将如何处理已经/尚未升级到 SSL 的客户端?例如,你打算使用 StartTLS 吗?
  • 假设服务器永远不会更新。我知道,这有点奇怪,但这是我目前的要求。

标签: ssl openssl


【解决方案1】:

通常应用程序接受普通连接和不同端口上的直接 SSL 连接,例如smtp 端口 25 和 smtps 端口 465,http 端口 80 和 https 端口 443 等。其他方法是使用相同的端口,然后从客户端发出特定命令来升级到 SSL,例如比如带有 smtp 的 STARTTLS 或带有 ftp 的 AUTH TLS。

如果这些常用方法不适合您,并且客户端无论如何都会在您的协议中发送第一个数据包(例如使用 http,但不是使用 smtp 或 ftp),您可能会在初始接受后执行 recv(..MSG_PEEK)看看,客户端发送了什么样的数据而不从套接字缓冲区中删除数据。如果偷看的数据看起来像您的普通应用程序协议,您继续那里,如果它们看起来像来自 SSL 的客户端问候(请参阅https://security.stackexchange.com/questions/34780/checking-client-hello-for-https-classification),您进行 SSL 升级。

【讨论】:

  • 这是一个非常好的解决方案,但是我无法修改服务器代码来实际实现它。我基本上只向客户端添加 SSL 支持,并连接到对 SSL 一无所知的服务器。在这种情况下,客户端将使用未加密的连接。
  • 如果我理解你的话,你不知道服务器是否有 SSL,但它会监听同一个端口。如果它有 SSL,它将是直接 SSL,而不是使用特定命令(如 smtp 中的 STARTTLS)进行 SSL 升级。那将是一个糟糕的设计:) 你的策略取决于通信协议。如果服务器在连接后以问候语开始,请稍等片刻,然后假设 SSL。否则,您可以尝试直言不讳,如果失败,您可以假设服务器会更喜欢 SSL。无论如何,请记住服务器选择以加快下一次连接。
  • 建立非 SSL 连接后,客户端和服务器之间会交换版本标识符。我曾短暂考虑过使用它来进行 SSL 升级,但攻击者可以修改版本号以使非 SSL 连接持续存在。 (即客户端认为它正在与旧服务器通信)
  • 只要您事先不知道哪些服务器是 SSL(据我了解,这是您的问题)降级攻击无论如何都是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2015-08-26
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2021-05-30
  • 2011-12-09
相关资源
最近更新 更多