使用JavaScript检测网页是否使用不受信任的SSL证书加载

5
有没有一种方法可以使用JavaScript检测在SSL证书无法由浏览器信任(但被用户接受)的情况下是否通过HTTPS加载了网站?即,它是无效/过期/自签名SSL证书。 window.isSecureContext不能表明这一点,在我自己尝试和在badssl.com上尝试的所有情况下,如果页面是通过HTTPS加载的,则为true
我的用例:我想使用ApplicationCache,但它拒绝工作:在Chrome上,它会触发具有异常消息“Manifest fetch failed (9)” "error"回调中,在Firefox上则默默失败。
由于这意味着浏览器的行为不同,因此我希望它是可检测的,并且我希望确保当无法使用ApplicationCache时完全跳过它。
我不想创建一个来自JavaScript的单独SSL连接(用户可能已经安装了自定义CA的证书等),也不想在ApplicationCache中尝试捕获异常。
2个回答

3

网页无法加载不受信任的SSL证书。它可能会加载一个未公开信任但用户已明确添加了例外的证书 - 这意味着用户信任该证书。

看起来你想知道的是,如果您的站点使用不同于服务器提供的证书加载,即是否存在一些活跃的中间人(如SSL拦截公司代理或本地防病毒产品)在客户端和服务器之间。为此,您需要了解证书详细信息,并将其与您的预期进行比较。不幸的是,这不可能从纯JavaScript中实现。

有关更多信息,请参见“在Web浏览器中,JavaScript是否可以获取有关当前页面所使用的HTTPS证书的信息?”, "是否有一种方法可以使用JavaScript获取SSL证书详细信息?"。有关检测MITM的另一种方法,请参见“检测HTTPS服务器端中间人攻击”“检测HTTPS拦截(使用caddy web服务器)”


当用户覆盖其信任或不信任证书的决定时,浏览器的行为会有所不同 - 请参见问题中的ApplicationCache示例。我想知道这是否是情况或证书是否有效。 - Gábor Héja
如我在答案中所写:您需要在浏览器内检查证书,这是无法使用Javascript实现的。请参阅我提供的前两个链接。 - Steffen Ullrich

0
有没有办法在JavaScript中检测网站是否使用浏览器不信任但被用户接受的SSL证书(即无效/过期/自签名SSL证书)通过HTTPS加载?
是的,这是可能的,但需要客户端不仅仅是JavaScript。
您可以设置一个服务器,接收https链接并返回证书是否有效。这样,通过使用JavaScript fetch命令,您可以验证证书是否受信任/有效。

谢谢您的回答,但我想仅在浏览器中检测它。此外,一个站点可能为不同的客户端呈现不同的证书,而且服务器可能无法访问客户端访问的站点(即内部网络、本地主机等)。 - Gábor Héja
我明白了,我可以告诉你,仅使用客户端JavaScript是不可能的。如果您想保持客户端,并且不介意解决方案不仅仅是JavaScript,那么您可以使用几乎过时的Flash或Java,因为它们允许您在客户端上创建TCP套接字。这将使您可以访问原始证书,从而能够自行验证它。仅使用JavaScript是不可能的,因为没有办法创建TCP套接字,而且很可能永远不会有,因为这是一个很大的安全问题。 - Ascari Gh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接