ssl - 是否可以根据服务器的公钥验证保存的 SSL session

标签 ssl tls1.2

这是我正在尝试做的事情:

  • 我正在开发一款人们可以跟踪产品价格的应用。
  • 我希望他们的手机能够抓取一些出现该产品的网站(征得他们的同意),每天两次。
  • 我不想重复执行此操作,如果有两个用户正在观看该产品,我只想使用其中一个来进行抓取。
  • 商品爬取完成后,将爬取结果推送到服务器(防止重复爬取)。
  • 在最后一步中,数据是从“不受信任”的来源推送的。有人可以对网络流量进行逆向工程,并可能将垃圾推送到终点。我希望抓取到的“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/

相关文章:

ssl - GitHub 桌面/Git 外壳 : SSL read: error:00000000:lib(0):func(0):reason(0), 错误号 10054

ssl - 如何使用 SSL_CTX 传递 EC 点格式列表?

java - key 管理器可以引用 WildFly 中的凭证存储吗?

java - 如何配置 apache httpclient 4.5+ SSLContext 以使用带有自签名证书的双向 TLS 身份验证?

带 Core 2.0 的 SSL 不工作

java - 在 Java Web 应用程序中处理 X-FORWARDED-PROTO header

c++ - 在 C/C++ 中同时与 Openssl epoll 服务器通信到多个客户端

ssl - OpenWRT HTTPS/SSL 流量重定向

ssl - Poco HTTPRequest中如何传递数据

ssl - 在 gRPC TLS 中禁用证书检查