这是我正在尝试做的事情:
- 我正在开发一款人们可以跟踪产品价格的应用。
- 我希望他们的手机能够抓取一些出现该产品的网站(征得他们的同意),每天两次。
- 我不想重复执行此操作,如果有两个用户正在观看该产品,我只想使用其中一个来进行抓取。
- 商品爬取完成后,将爬取结果推送到服务器(防止重复爬取)。
- 在最后一步中,数据是从“不受信任”的来源推送的。有人可以对网络流量进行逆向工程,并可能将垃圾推送到终点。我希望抓取到的“HTML”是真实的,并且来自其预期的商家网站。
问题如下: - 我认为这可以通过为特定请求存储加密的 SSL 流量来实现,并且在服务器端,我可以根据商家证书(比方说,newegg)的公钥验证它。
但是,我不完全确定这是否可行,而且我一直在编写代码。的代码片段将不胜感激(只要它不是直接来自 openssl 命令 :))
最佳答案
理论上应该可以根据服务器证书(即证书中的公钥)验证捕获的 TLS 握手,以确保此握手是与服务器创建的。但是,仅凭这一点并不能证明解密数据和 TLS 握手属于同一个 TLS session 。为此,您还需要连接的(预)主密码。
请注意,修改机器人将从内部 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 可用于验证和解密嗅探 session 。为此,您可以查看 Wireshark 的源代码。
如果您可以信任机器人本身,那么让机器人对解密的流量进行签名以便检测虚假数据会简单得多。
关于ssl - 是否可以根据服务器的公钥验证保存的 SSL session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47627183/