检测用户何时故意绕过 https 服务器证书错误

Detect when users deliberately bypass https server certificate errors

服务器上是否有 https header 或浏览器中的 JavaScript 方法,可以让我们检测用户何时故意绕过安全证书,或任何其他检测方式并报告这种情况? (我们正在使用 Linux / Apache / jQuery。)

网络上到处都是例行公事地跳过警告的方法,但我还没有找到任何关于检测用户何时跳过警告的方法——只有可怕的统计数据70% 的用户会尽快绕过警告。 (他们如何衡量?)

我们运行一个网络应用程序,让教师可以进行测试和管理测试。教师连接到未经授权的 WiFi 网络,收到无效证书警告,并单击浏览器的 "accept anyway" 功能,以便他们可以在证书未经身份验证的情况下访问我们的应用程序。我们想了解这种情况发生的频率,谁在做,并努力阻止它。

我应该注意到有些学校通过他们自己的服务器代理请求,使用他们自己的证书,我们对此没有意见 - 这是我们想要衡量和缓解的 "ignore and connect anyway" 连接,因为那些是学生正在设置的,无法访问他们自己的 CA,但可以充分访问懒惰的用户。

不确定绕过 HTTPS 是什么意思。如果您的意思是他们可以在没有 HTTPS 的情况下访问您的 URI,则意味着您需要在 Apache 的 .htaccess、httpd.conf 或 default-ssl 配置文件中阻止 HTTP 访问。破损的挂锁可能意味着许多不同的事情,因此不清楚您遇到的是哪个问题。您可以在此处测试您的网站是否存在 SSL 安全问题:

https://www.ssllabs.com/ssltest/

编辑:

您可以比较服务器端和客户端的 SSL 证书 fingerprint 以确保它们匹配(如果客户端能够获取指纹)。这应该可以防止使用伪造证书的中间人攻击。

Article

here's an answer 用于在服务器端执行此操作。听起来避免拦截的最佳方法是使用自己的证书对客户端进行身份验证。

无法检测到这一点 - 用户是唯一可以看到挂锁是绿色锁定还是红色损坏的人。

Firefox 会执行此操作 by extension and through xhtml,但它是目前唯一支持此功能的浏览器。

我正在寻找 HSTS。 Here is how it works and how to implement it.

TL;DR: Header add Strict-Transport-Security "max-age=15768000 includeSubDomains"

确保客户端已看到您发送的服务器证书的一种方法是使用客户端证书身份验证。使用客户端证书身份验证时 SSL/TLS 握手的最后步骤之一包含使用客户端私钥签名的所有握手消息的哈希值。

这样做的副作用是,如果客户端没有看到完全相同的服务器证书,服务器将无法验证来自客户端的签名哈希。

这当然不一定意味着客户端检查了它应该检查的证书(即证书是否受信任并属于客户端打算联系的服务器),但至少服务器有办法做到这一点中间没有假证书。

HSTS(您提到的)也有一种方法可以让客户端强制执行这些检查(请参阅 Section 8.4 of RFC 6797). However, it only works if the client already knows HSTS needs to be used (either as a pre-loaded host, or after a first visit), and of course relies on the client supporting HSTS (browser support is still limited)。