我正在努力在现有应用程序中添加SSL支持,并开始考虑向后兼容性。
与我读过的其他帖子不同的一个特例是服务器可能不一定用SSL代码更新。所以我将有一个SSL客户端连接到一个对SSL一无所知的服务器。
为了便于讨论,应用程序一次一个地向服务器发送击键,并且对于每次击键,都会创建一个新的套接字。所以我需要想办法让这个工作在现有的端口号上,而不是使用超时来确定服务器是否支持SSL。
有关优雅方式的任何建议吗?
(我正在使用Winsock和OpenSSL)
答案 0 :(得分:1)
通常,应用程序接受普通连接并在不同端口上直接连接SSL,例如smtp端口25和smtps端口465,http端口80和https端口443等。其他方法是使用相同的端口,然后从客户端使用特定命令升级到SSL,例如,比如STARTTLS with smtp或AUTH TLS with ftp。
如果这些常用方法不是您的选择,并且客户端无论如何都会在您的协议中发送第一个数据包(例如使用http,但不能使用smtp或ftp),您可以在初始接受后执行recv(.. MSG_PEEK)看看,客户端发送了什么样的数据,而没有从套接字缓冲区中删除数据。如果偷看的数据看起来像您的普通应用程序协议,那么如果它们看起来像来自SSL的客户端问候语(请参阅https://security.stackexchange.com/questions/34780/checking-client-hello-for-https-classification),则执行SSL升级。