Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在web浏览器中,JavaScript是否可以获取有关当前页面使用的HTTPS证书的信息?_Javascript_Browser_Ssl_Certificate_Ssl Certificate - Fatal编程技术网

在web浏览器中,JavaScript是否可以获取有关当前页面使用的HTTPS证书的信息?

在web浏览器中,JavaScript是否可以获取有关当前页面使用的HTTPS证书的信息?,javascript,browser,ssl,certificate,ssl-certificate,Javascript,Browser,Ssl,Certificate,Ssl Certificate,浏览器中运行的JavaScript是否有一种方法来确定使用哪个CA证书对浏览器当前HTTPS连接的远程主机进行身份验证,并获取该证书的属性,例如CA的名称 如果没有,是否有其他编程方式获取此信息的选项,如ActiveX、Java、服务器端的CGI等?否。显然,您可以使用AJAX/ActiveX/Java/Flash/Silverlight和自定义服务器端脚本来实现此功能,但我不明白您为什么需要此功能 编辑:上面的想法是向服务器发出网络请求(使用上述技术之一),并询问该网络请求使用了什么证书。然

浏览器中运行的JavaScript是否有一种方法来确定使用哪个CA证书对浏览器当前HTTPS连接的远程主机进行身份验证,并获取该证书的属性,例如CA的名称


如果没有,是否有其他编程方式获取此信息的选项,如ActiveX、Java、服务器端的CGI等?

否。显然,您可以使用AJAX/ActiveX/Java/Flash/Silverlight和自定义服务器端脚本来实现此功能,但我不明白您为什么需要此功能


编辑:上面的想法是向服务器发出网络请求(使用上述技术之一),并询问该网络请求使用了什么证书。然后服务器可以检查自己的配置并回答问题

如果浏览器以某种方式信任无效的证书并连接到错误的服务器(例如,MITM服务器),则服务器可能存在漏洞。一旦浏览器的信任机制遭到破坏,我不知道如何避免


据我所知,没有办法(纯粹使用客户端API)直接询问浏览器“针对浏览器的当前SSL连接”使用了什么证书。即使是福吉也不会这么做。它创建了一个完全并行的SSL会话,但它不允许您询问浏览器的本机SSL会话。

AFAIK不仅仅使用Javascript。但是有些Web服务器允许您访问线程或进程的连接参数。然后,服务器端脚本可以将这些值与请求一起发送,您可以使用它

我为nginx Web服务器找到了以下内容: (查看页面底部的变量)。应该可以将它们设置为环境变量,并将它们传递给FastCGI进程或您使用的任何程序


AOLServer/Naviserver允许使用nsssl模块进行类似的访问。

在web浏览器中运行的JavaScript无权访问证书信息。证书信息也不会通过HTTP传递给应用程序。我的研究表明,web应用程序无法确定中间人攻击是否在主机和客户端之间的某个位置注入了伪造的证书。

您可以使用开源软件来实现这一点。它在JavaScript中实现SSL/TLS。您可以对服务器进行ajax调用,并使用回调来检查证书。请记住,服务器是发送JavaScript的服务器,因此不应使用它来确定您是否信任JavaScript来自的服务器。Forge项目确实允许跨域请求,因此如果您使用它来获得信任,您可以从您已经信任的服务器加载Forge JavaScript,然后联系您还不信任的服务器。但是,除非其他服务器提供跨域策略,否则您将无法执行跨域请求


自述文件中的博客链接提供了有关如何使用Forge及其工作原理的更多信息。

实际上,这没有什么用处——为什么您需要从已呈现的单独页面上的JavaScript了解证书信息

  • 如果它不可信,那么很明显,您的代码也可能被修改,因此,它也不可信

  • 如果证书实际上是可信的,那么您如何能够区分证书不可信的场景和证书不可信的场景,但您的代码已通过MitM攻击进行了修改,从而产生了相反的想法


因此,检查证书只在浏览器扩展中有用(假定为可信代码),而不是在单个页面中的脚本本身。扩展使用的这种接口是特定于浏览器的,甚至不是所有浏览器都提供它。例如,虽然Mozilla浏览器允许您查看证书(提供了类似的扩展),但是,。

从中复制我自己的答案

2018年答案:是的,在Firefox 62中 您需要创建一个WebExtension,也称为浏览器扩展

您还可以查看以下文档:

你需要Firefox 62

下面是一个正在运行的
background.js

var log = console.log.bind(console)

log(`\n\nTLS browser extension loaded`)

// https://developer.chrome.com/extensions/match_patterns
var ALL_SITES = { urls: ['<all_urls>'] }

// Mozilla doesn't use tlsInfo in extraInfoSpec 
var extraInfoSpec = ['blocking']; 

// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/onHeadersReceived
browser.webRequest.onHeadersReceived.addListener(async function(details){
    log(`\n\nGot a request for ${details.url} with ID ${details.requestId}`)

    // Yeah this is a String, even though the content is a Number
    var requestId = details.requestId

    var securityInfo = await browser.webRequest.getSecurityInfo(requestId, {
        certificateChain: true,
        rawDER: false
    });

    log(`securityInfo: ${JSON.stringify(securityInfo, null, 2)}`)

}, ALL_SITES, extraInfoSpec) 

log('Added listener')


它也可以在Chromium中实现一次。

感谢您的搜索。nginx web服务器信息适用于客户端证书,用于使用web应用程序对用户进行身份验证。我感兴趣的是获取有关客户端浏览器上使用的CA证书的信息——认证浏览器正在访问的网站的CA证书。我将。。。在AJAX中如何实现这一点?之所以需要这样做,是为了检查客户端是否使用了伪造的CA证书,从而允许中间人攻击。@MaxRied,答案是“不,但是”,我说“不…”。问题是关于如何“确定哪个CA证书用于验证浏览器当前SSL连接的远程主机”,也就是说,如果浏览器有一个正常的SSL堆栈(当前正在使用),您能否询问浏览器当前SSL连接使用的证书和此类证书。基本上,不管你写了多少JS,你都不能。(Forge创建了一个并行SSL会话,它不检查标准会话)。但是,您可以根据SSL信任的标准问题询问您自己的服务器。这更像是“嘿,不要那样做”。OP并没有问你们是否认为这是一个好主意(这将是一个离题的“主要基于意见的”,这也会使你们的答案离题,但这是另一点…)。他问怎么做。这不是质疑问题的平台,而是解决问题的平台。你应该知道的。@MaxRied,不,不是。不可能按照实际问题的要求去做,也就是w
{
    "manifest_version": 2,
    "name": "Test extension",
    "version": "1.0",
    "description": "Test extension.",
    "icons": {
        "48": "icons/border-48.png"
    },
    "background": {
        "scripts": ["background.js"]
    },
    "permissions": [
        "webRequest",
        "webRequestBlocking",
        "<all_urls>"
    ]
}