我有一个场景,其中 TcpListner 充当客户端和服务器之间的代理。代理需要记录所有互联网流量。SSL 加密所有的 html 内容。
我可以从流中获取密钥来解密 SSL 内容吗?如果没有,我可以充当 SSL 服务器。但切入点在哪里?当服务器告诉客户端使用 ssl 时?通过将来自服务器的流编码为 ASCII,我什至看不到 html 文本只是标题。
SSL 旨在防止中间人攻击,因此您将无法提取密钥来解密流量。如果您的应用程序充当代理,那么您可能收到的唯一明文将是初始CONNECT
请求。
一种选择是像许多商业防火墙一样允许 SSL 检查,即模拟与客户端连接的远程端,为每个防火墙建立单独的 SSL 流。为此,您需要做很多事情,并且只有在您能够在所有将使用您的代理的客户端上安装您自己的受信任的根证书(例如,使用 Windows 组策略)时,它才会起作用。如果你不能做到这一点,你还不如放弃,因为这会让你试图做的事情变得不可能。
CONNECT
。SslStream
包装连接并调用AuthenticateAsClient(...)
.SslStream
,包装客户端的传入网络流,并AuthenticateAsServer()
使用步骤 2 中生成的证书进行调用。从您的问题来看,您似乎有一个客户端、一个中间代理和一个服务器。客户端和服务器使用 SSL 进行通信,并且您希望代理解密客户端和服务器之间的 SSL 加密消息。
那么第一个问题,服务器是你的吗?如果不是,那么这正是 SSL 应该防止的。下次您使用信用卡在 Internet 上购买商品时,请考虑一下您的 ISP 会做什么,如果您的要求是可能的——他们可以在您和网上商店之间设置代理并解密您的信用卡号,然后您我永远不知道。
如果您有私钥,您只能解密 SSL 数据包。如果您想检查或记录 Internet 流量,请查看wireshark ,或者使用fiddler了解 HTTPS 解密的实用方法。