是否有一种JavaScript在浏览器中运行的方法,以确定哪个CA证书用于为浏览器的当前HTTPS连接验证远程主机,还获取该证书的属性,例如CA的名称?< / p>
如果没有,是否有任何其他选项以编程方式获取此信息,例如服务器端的ActiveX,Java,CGI,......?
答案 0 :(得分:17)
您可以使用opensource Forge project执行此操作。它在JavaScript中实现SSL / TLS。您可以对服务器进行ajax调用,并使用回调来检查证书。请记住,服务器是发送JavaScript的服务器,因此不应该用它来确定您是否信任JavaScript来自的服务器。 Forge项目允许跨域请求,因此如果您使用它来进行信任,则可以从您已信任的服务器加载Forge JavaScript,然后联系您不信任的服务器。但是,除非该其他服务器提供跨域策略,否则您将无法执行跨域请求。
https://github.com/digitalbazaar/forge/blob/master/README.md
自述文件中的博客链接提供了有关如何使用Forge及其工作原理的更多信息。
答案 1 :(得分:6)
从Is there any way to access certificate information from a Chrome Extension
复制我自己的答案您需要制作一个WebExtension,也称为浏览器扩展程序。
请参阅accessing security information on MDN
您还可以查看以下文档:
你需要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中实现一次this code is merged。
答案 2 :(得分:2)
没有。您显然可以使用AJAX / ActiveX / Java / Flash / Silverlight和自定义服务器端脚本来完成它,但我不明白为什么您需要它。
如果浏览器以某种方式信任无效证书并连接到错误的服务器(例如MITM服务器),则服务器可能会撒谎。一旦浏览器的信任机制受到损害,我不知道如何避免这种情况。
据我所知,没有办法(纯粹使用客户端API)直接询问浏览器使用“用于浏览器当前SSL连接”的证书。即使福吉也不这样做。它创建了一个完全并行 SSL会话,但它不会让您询问浏览器的本机SSL会话。
答案 3 :(得分:2)
在Web浏览器中运行的JavaScript无权访问证书信息。证书信息也不会通过HTTP传递给应用程序。我的研究表明,Web应用程序无法确定中间人攻击是否在主机和客户端之间的某处注入了虚假证书。
答案 4 :(得分:1)
AFAIK不仅仅是Javascript。但是一些Web服务器允许您访问线程或进程的连接参数。然后,服务器端脚本可以将这些值与请求一起发送并使用它。
我为nginx webserver找到了这个: http://wiki.nginx.org/NginxHttpSslModule (查看页面底部的变量)。应该可以将它们设置为环境变量,并将它们传递给您的FastCGI流程或任何您使用的流程。
AOLServer / Naviserver允许使用nsssl模块进行类似的访问。
答案 5 :(得分:-4)
实际上,这没什么用处 - 为什么你需要知道已经呈现的个人页面上的JavaScript证书信息?
如果它不受信任,那么显然您的代码也可能已被更改,因此,它也不可信任。
如果证书实际上是受信任的,那么您如何区分该场景与证书不受信任的场景,但您的代码是否已通过MitM攻击进行修改而不这样做?
因此,检查证书只会在 浏览器扩展 (假定为可信代码)中有用,而不是各个页面中的脚本自己。扩展使用的这种接口是特定于浏览器的,并非所有浏览器都提供它。例如,Mozilla浏览器可让您查看证书(提供EFF SSL Observatory),Chromium is still lacking等扩展名。