有没有办法使用JavaScript获取SSL证书详细信息?

时间:2010-04-09 00:39:30

标签: javascript ssl javascript-events openssl

我想在特定网站上收集SSL证书的某​​些详细信息。我知道在Linux / MacOSX上使用openssl工具很简单。但是在JavaScript中是相同还是相似?

我知道浏览器处理套接字连接,并且SSL握手发生在任何一方发送数据之前。但是在XMLHTTPRequest中,我想知道是否有可能将这些细节作为某种响应代码等?

4 个答案:

答案 0 :(得分:9)

这些信息根本没有暴露给javascript,它很少被使用(从来没有,因为它不可用,但 很少使用)它被认为不够重要添加到javascript对象模型我想...对于任何很少使用的功能都是相同的。

当然,出于安全原因,它也可能被排除在外......我现在没有足够的创造力来提出一个,但我确信在那里也有利用。< / p>

答案 1 :(得分:3)

证书不是DOM的一部分,所以不,这是不可能的。遗憾!

答案 2 :(得分:1)

不,不可能。

可以通过javascript检测当前正在查看的页面是否通过SSL连接(document.location.protocol ==“https:”),但这就是它。

答案 3 :(得分:1)

当前的JS语言标准不公开证书信息;除此之外它可能取决于你如何使用JavaScript,如果你期望最终用户的浏览器公开证书信息,那么它会成为真正的问题,因为你&#39; d需要获得最低限度的FF,Chrome,Safari,IE,Edge,......以暴露它。

然而,正如本Information Security post所述,这对于这些浏览器来说实际上并不是一个理想的选择,因为它会让网站开发人员编写代码以错误地信任用户端凭据。

可见性安全风险并不会阻止javascript访问浏览器当前的SSL证书信息,但更多的是第四道墙壁安全风险,JS开发人员必须意识到& #34;用户接受&#34;证书不一定是网站提供的证书。 HTML页面确实不应该处理客户端代码的安全问题,而是应该能够依赖安全层来正确地完成它的工作。 (我完全理解想要在安全层上进行检查,但是你在顶层做的任何管理工作都只是表面上的或者是整个生物圈的改造)

因为我们暂时假设javascript确实提供了使用证书的方法,所以当Bob已经信任Mallory因为他的安全性被破坏时,无法停止以下交换:

办公室工作人员Bob位于Mega公司的大防火墙的一侧,IT Mallory负责防火墙在本地传入和传出公司的流量,Web Host Alice的网站很棒WWW。

  1. 根据Mega Corp.的公司政策,鲍勃准备接受马洛里在面值时所说的话。
  2. 鲍勃想要访问爱丽丝的网站,但没有直接的外部访问权限,试图通过举起他的证书通过防火墙建立安全连接(例如:&#34;我在此声明我是Bob& #34;)并以一种非常复杂的方式询问Alice,&#34;我发送给你的证书是什么?&#34;
  3. 马洛里得到了鲍勃的请求,而是自己传递(例如:&#34;呃,鲍勃说我可以阅读他的网络邮件&#34;),即使马洛里我不理解鲍勃的错综复杂的问题,她仍然向爱丽丝重复一遍,&#34; akdvyfenwythnwerhy?&#34;。
  4. 爱丽丝做了一些数学计算,并指出了#34; akdvyfenwythnwerhy?&#34;问我是什么证书给了你?&#34;然后用她看到的东西回答马洛里(&#34;嗨鲍勃,这是爱丽丝,你说:呃,鲍勃说我可以阅读他的网络邮件&#34;)。
  5. 马洛里做了一些数学,有一个哈哈时刻&#34; akdvyfenwythnwerhy?=我发给你的证书是什么?&#34;,并代表爱丽丝回答鲍勃的问题(&#34;嗨Bob这是Alice( Mallory )你说:我特此声明我是鲍勃&#34;)。
  6. 鲍勃认为生活很美好,并继续阅读他的网络邮件,因为根据公司政策,他知道马洛里永远不会骗他。
  7. 马洛里现在能够阅读对话的双方传递鲍勃的请求,以便将他的网络邮件读给爱丽丝。
  8. Alice得到了鲍勃的请求并说他等了一会儿鲍勃我需要你运行这个JS代码来证明你知道你正在和爱丽丝说话。
  9. Mallory获取代码,运行代码并发送结果,表明她知道她正在和Alice谈话回Alice。
  10. Alice说,这对我来说已经足够了,这是你的网络邮件。
  11. 马洛里在将鲍勃传递给鲍勃之前阅读了鲍勃的网络邮件,每个人都幸福快乐。
  12. (注意:我没有说明你在JS服务器端运行的情况,那么它将取决于你用来运行JS代码的程序。)

    <小时/> 编辑4/4/2018 - 虽然上面没有错,但从嵌入式和链接式JS的角度来看,它比XMLHTTPRequest JS对象更多;此外,与XMLHTTPRequest共享PKI详细信息的最强有力论据可能如下:

    需要在HTTP协议的HTTP部分和S部分之间保持强大的分界线。 JavaScript及其XMLHTTPRequest对象驻留在该行的HTTP(应用层)一侧,而整个证书交换过程驻留在该行的S(跨/秒层)一侧。为了保持安全端的原子性(热插拔),其内部工作不能通过线路暴露给应用程序端;因为可能有一天传输/安全层不再使用PKI证书来促进其安全的通信服务,当那一天到来时,没有人需要重写任何依赖于这些证书中包含的细节的现有JS代码来处理随着www社区引起的传播波慢慢采用他们喜欢的任何新安全层的风格。

    话虽如此,安全方似乎也在进行法律实体审查 - 至少在某些情况下如EV证书 - 并且IMO是RFC7230 section 2.7.2的短暂内容,它不会重新定义authority的{​​{1}}包含一个可选的https-URI,安全层在验证与之通信的网址时将使用该legalentity不仅是正确的终点,而且目前还在预期的业务关系。

    authority     = [ userinfo "@" ] host [ "#" legalentity ] [ ":" port ]
    legalentity   = *( unreserved / pct-encoded / sub-delims )