是否可以根据服务器的 public 密钥验证保存的 SSL 会话
Is it possible to verify a saved SSL session against public key of server
这是我正在尝试做的事情:
- 我正在开发一款人们可以跟踪产品价格的应用程序。
- 我希望他们的手机能够抓取某些出现此产品的网站(征得他们的同意),每天两次。
- 我不想冗余地这样做,如果两个用户都在看产品,我只想使用其中一个来进行抓取。
- 商品抓取完成后,抓取结果会推送到服务器(防止重复抓取)。
- 在最后一步中,数据是从 "untrusted" 来源推送的。有人可以对网络流量进行逆向工程,并可能将垃圾推送到终点。我希望抓取的内容 "HTML" 是真实的,并且来自其预期的商家网站。
问题如下:
- 我认为这可以通过为特定请求存储加密的 SSL 流量来实现,并且在服务器端,我可以根据商家证书的 public 密钥验证它(比方说,newegg)。
但是,我不完全确定这是否可行,而且我一直在编写代码。的代码片段将不胜感激(只要它不是直接来自 openssl 命令:))
理论上应该可以根据服务器证书(即证书中的 public 密钥)验证捕获的 TLS 握手,以确保此握手是与服务器创建的。但是,仅凭这一点并不能证明解密数据和 TLS 握手属于同一个 TLS 会话。为此,您还需要连接的(预)主密钥。
请注意,修改机器人将从内部 SSL 状态和加密流量中提取(预)主密码,将此密码和加密流量与普通流量一起存储,并编写一些代码来验证所有这些都属于一起不是一项微不足道的任务。根据所使用的 SSL 库,可能需要深入挖掘内部结构并使用未记录的(非 API)函数来执行此操作或直接从某些内部结构中获取信息。
Code snippets for would be appreciated (as long as it's not straight out of openssl commands :))
最新版本的 OpenSSL 具有 SSL_SESSION_get_master_key 功能。但我不知道 OpenSSL 中有任何 API 可用于验证和解密嗅探会话。你可以看看 Wireshark 的源代码。
如果您可以信任 bot 本身,那么让 bot 对解密的流量进行签名以便检测虚假数据会简单得多。
这是我正在尝试做的事情:
- 我正在开发一款人们可以跟踪产品价格的应用程序。
- 我希望他们的手机能够抓取某些出现此产品的网站(征得他们的同意),每天两次。
- 我不想冗余地这样做,如果两个用户都在看产品,我只想使用其中一个来进行抓取。
- 商品抓取完成后,抓取结果会推送到服务器(防止重复抓取)。
- 在最后一步中,数据是从 "untrusted" 来源推送的。有人可以对网络流量进行逆向工程,并可能将垃圾推送到终点。我希望抓取的内容 "HTML" 是真实的,并且来自其预期的商家网站。
问题如下: - 我认为这可以通过为特定请求存储加密的 SSL 流量来实现,并且在服务器端,我可以根据商家证书的 public 密钥验证它(比方说,newegg)。
但是,我不完全确定这是否可行,而且我一直在编写代码。的代码片段将不胜感激(只要它不是直接来自 openssl 命令:))
理论上应该可以根据服务器证书(即证书中的 public 密钥)验证捕获的 TLS 握手,以确保此握手是与服务器创建的。但是,仅凭这一点并不能证明解密数据和 TLS 握手属于同一个 TLS 会话。为此,您还需要连接的(预)主密钥。
请注意,修改机器人将从内部 SSL 状态和加密流量中提取(预)主密码,将此密码和加密流量与普通流量一起存储,并编写一些代码来验证所有这些都属于一起不是一项微不足道的任务。根据所使用的 SSL 库,可能需要深入挖掘内部结构并使用未记录的(非 API)函数来执行此操作或直接从某些内部结构中获取信息。
Code snippets for would be appreciated (as long as it's not straight out of openssl commands :))
最新版本的 OpenSSL 具有 SSL_SESSION_get_master_key 功能。但我不知道 OpenSSL 中有任何 API 可用于验证和解密嗅探会话。你可以看看 Wireshark 的源代码。
如果您可以信任 bot 本身,那么让 bot 对解密的流量进行签名以便检测虚假数据会简单得多。