我有一个有趣的网络安全挑战,我无法找出最好的攻击方式。
我需要提供一种方法,允许防火墙后面的两台计算机(A和B)使用互联网上常见的“代理”不受信任的服务器(像RackSpace这样的地方)建立彼此的安全连接。 (服务器被认为是不可信的,因为防火墙后面的客户不会信任它,因为它在开放的服务器上)我无法调整防火墙设置以允许网络直接连接到彼此,因为连接之前是未知的时间。
这非常类似于NAT到NAT连接问题,例如由远程桌面帮助工具(crossloop,副驾驶等)处理的问题。
我真正想要找到的是在两台主机之间打开SSL连接并让公共服务器代理连接的方法。优选地,当主机A尝试连接到主机B时,它应该必须提供代理在建立连接之前可以与主机B核对的令牌。
要为此添加另一个皱纹,连接机制需要支持两种类型的通信。首先,对REST Web服务的HTTP请求/响应和允许实时消息传递的第二个持久套接字连接。
我已经看过我所知道的技术,比如使用证书,OAuth等OpenSSL,但我没有看到任何我需要的东西。
有没有其他人之前处理过这样的事情?有什么指针吗?
答案 0 :(得分:2)
您可以使用普通SSL解决问题。
将客户端主机之间的不受信任的服务器转发连接作为不透明的TCP连接。然后,客户端通过转发的TCP隧道建立端到端SSL连接 - 使用OpenSSL,一个客户端调用SSL_accept()
,另一个调用SSL_connect()
。
使用证书(可能包括客户端证书)来验证SSL连接的另一端是否是您期望的那样。
(这在概念上类似于HTTPS连接在Web代理上工作的方式 - 浏览器只是说“将我连接到此目的地”,并与所需端点建立SSL连接。代理只是向后转发加密的SSL数据转发,并且由于它没有正确证书的私钥,因此无法模拟所需的端点。)
答案 1 :(得分:1)
通常,SSL是基于数据包的协议(用于解决您的任务)。如果您可以让主机来回转发数据包,您可以轻松拥有SSL安全通信通道。您需要的一件事就是我们的SSL/TLS components,它允许任何传输而不仅仅是套接字。即该组件告诉您的代码“将此数据包发送到另一方”或“您有什么东西供我接收吗?”并且您的代码与中间服务器通信。