ssl - 在同一端口上支持 SSL 和非 SSL

标签 ssl openssl

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

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

为了便于讨论,应用程序一次向服务器发送一次击键,并且对于每次击键都会创建一个新套接字。因此,我需要找到一种方法,使其在现有端口号上工作,而不是使用超时来确定服务器是否支持 SSL。

有什么关于优雅的方式来处理这个问题的建议吗?

(我正在使用 Winsock 和 OpenSSL)

最佳答案

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

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

关于ssl - 在同一端口上支持 SSL 和非 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126408/

相关文章:

facebook - 使用 Facebook oauth 登录,没有完整的 facebook.com 访问权限

java - 如何配置 spring boot 应用程序以在 MySQL 上使用 SSL/TLS?

java - 如何在 java 客户端禁用自签名证书?

java - 安卓 KeyPairGenerator + php openssl_public_encrypt

ruby-on-rails - 如何使用 OpenSSL::Cipher 加密 UTF-8 字符串中的数据?

ssl - openssl pkcs12 - 以编程方式导出

java - GRPC Java : Set up SSLContext on Server

ios - 在 iOS 中执行 SSL 请求

node.js - Crypto Hmac node.js 相当于 ruby​​ 的以下功能

用于仅 TLS 连接协商的 Node.js TLS 选项