是否有一种方法可以让浏览器中运行的 JavaScript 确定使用哪个 CA 证书来验证浏览器当前 HTTPS 连接的远程主机,并获取该证书的属性,例如 CA 的名称?
如果没有,是否还有其他选项可以以编程方式获取此信息,例如服务器端的 ActiveX、Java、CGI,...?
是否有一种方法可以让浏览器中运行的 JavaScript 确定使用哪个 CA 证书来验证浏览器当前 HTTPS 连接的远程主机,并获取该证书的属性,例如 CA 的名称?
如果没有,是否还有其他选项可以以编程方式获取此信息,例如服务器端的 ActiveX、Java、CGI,...?
您可以使用开源Forge 项目来执行此操作。它在 JavaScript 中实现了 SSL/TLS。您可以对服务器进行 ajax 调用并使用回调来检查证书。请记住,服务器是发送 JavaScript 的服务器,因此不应使用它来确定您是否信任 JavaScript 来自的服务器。Forge 项目确实允许跨域请求,因此如果您将其用于信任,您可以从您已经信任的服务器加载 Forge JavaScript,然后联系您尚不信任的服务器。但是,除非其他服务器提供跨域策略,否则您将无法执行跨域请求。
https://github.com/digitalbazaar/forge/blob/master/README.md
自述文件中的博客链接提供了有关如何使用 Forge 及其工作原理的更多信息。
从有没有办法从 Chrome 扩展程序访问证书信息中复制我自己的答案
您需要制作一个 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')
manifest.json
:
{
"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>"
]
}
一旦合并此代码,它也可以在 Chromium 中实现。
在 Web 浏览器中运行的 JavaScript 无法访问证书信息。证书信息也不会通过 HTTP 传递给应用程序。我的研究表明,Web 应用程序无法确定中间人攻击是否在主机和客户端之间的某处注入了伪造的证书。
不。您显然可以使用 AJAX/ActiveX/Java/Flash/Silverlight 和自定义服务器端脚本来实现,但我不明白您为什么需要它。
编辑:上面的想法是您将向服务器发出网络请求(使用上述技术之一)并询问该网络请求使用了什么证书。然后服务器可以检查自己的配置并回答问题。
如果浏览器以某种方式信任无效证书并连接到错误的服务器(例如 MITM 服务器),则该服务器可能会撒谎。一旦浏览器的信任机制遭到破坏,我不知道如何避免。
据我所知,没有办法(纯粹使用客户端 API)直接询问浏览器“用于浏览器当前 SSL 连接”的证书。即使 Forge 也不会这样做。它创建了一个完全并行的SSL 会话,但它不允许您询问浏览器的本机 SSL 会话。
AFAIK 不是单独使用 Javascript。但是有些网络服务器允许您访问线程或进程的连接参数。然后,服务器端脚本可以将这些值与请求一起发送,您可以使用它。
我为 nginx 网络服务器找到了这个:http : //wiki.nginx.org/NginxHttpSslModule (查看页面底部的变量)。应该可以将它们设置为环境变量并将它们传递给您的 FastCGI 进程或任何您使用的进程。
AOLServer/Naviserver 允许使用 nsssl module进行类似的访问。