如果我正确理解了这个问题,您是在问是否可以检测(在 HTTPS 连接的服务器端)连接是来自代理服务器还是实际客户端(浏览器)?
(我最初没有看到证书如何提供任何有价值的信息,但现在意识到我之前错过了什么。建议为用户提供 javascript,通过 HTML 代码触发它并让用户发回提取的来自 SSL 证书的数据,因为它将是代理提供的证书。是的,这应该可以工作,代理服务器似乎不太可能从 javascript 中过滤此类“操作”。聪明的建议!)
分析以下内容可能有助于发现连接的发起者:
- HTTP标头排序
- 非浏览器特定的 HTTP 标头
- HTTP cookie 值
- HTTP 行为
HTTP-header ordering - 理论上应该可以通过分析 HTTP 标头的顺序来检测连接的发起者。浏览器倾向于以特定的“模式”来构建其 HTTP 标头,利用这些知识可以:
- 通过确定代理如何排列 HTTP 标头,为代理创建唯一指纹。
- 通过“提前”了解常见浏览器如何排序其 HTTP 标头并将其与当前请求的排序进行比较。(显然不是最好的主意......)
非浏览器特定的 HTTP 标头- 代理服务器可能包含浏览器不会包含的特定 HTTP 标头。这些可能用于负载平衡或请求类型重定向等。
HTTP-cookie 值- 如果使用负载平衡或集群,代理将插入特定的 cookie 值来引导与特定服务器的连接也是可以想象的。
HTTP 行为- 虽然实现起来并不容易,但可以通过启动一些特定于 HTTP 的返回代码并分析“客户端”如何响应请求来检测代理的存在。也许这可能允许检测对于常规浏览器来说不常见的异常行为。
假设是一个 Apache HTTP 服务器,可以使用 mod_security 规则来实现上述某些功能。
其他一些可能不太可能且不可靠的检测连接来源的方法是检查协议特定 (IP/TCP) 字段,例如时间戳、IP 选项。假设代理服务器来源,这些可能会以特定方式发生变化。
尽管它们会受到相当多的抖动和噪声的影响,但也可以根据时间来确定来源,理论上可以确定代理是否拦截了连接。我并不是说这完全是可靠的甚至是可能的,但是可以通过时间来确定很多。