在浏览器中运行的JavaScript是否有一种方法可以确定用于验证当前HTTPS连接的远程主机的CA证书,并获取该证书的属性,例如CA名称?
如果没有,是否有其他选项可以以编程方式获取此信息,例如ActiveX、Java或服务器端CGI等?
在浏览器中运行的JavaScript是否有一种方法可以确定用于验证当前HTTPS连接的远程主机的CA证书,并获取该证书的属性,例如CA名称?
如果没有,是否有其他选项可以以编程方式获取此信息,例如ActiveX、Java或服务器端CGI等?
https://github.com/digitalbazaar/forge/blob/master/README.md
README中的博客链接提供了有关如何使用Forge以及其工作原理的更多信息。
从Is there any way to access certificate information from a Chrome Extension中复制我的答案。
你需要创建一个WebExtension,也称为浏览器扩展程序。
请参阅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中实现。
运行在Web浏览器中的JavaScript无法访问证书信息。该证书信息也不通过HTTP传递给应用程序。我的研究表明,Web应用程序无法确定是否存在中间人攻击,即恶意证书被注入到主机和客户端之间。
据我所知,仅使用Javascript是不行的。但是一些Web服务器允许您访问线程或进程的连接参数。然后,服务器端脚本可以将这些值与请求一起发送,并且您可以使用它。
我在nginx Web服务器上找到了这个: http://wiki.nginx.org/NginxHttpSslModule (请查看页面底部的变量)。应该可以将它们设置为环境变量并将它们传递给您使用的FastCGI进程或其他内容。
AOLServer/Naviserver使用nsssl模块允许类似的访问。
实际上,这没有什么用处——为什么你需要从已经呈现的单个页面中的JavaScript了解证书信息呢?
如果它不被信任,那么显然你的代码也可能被修改,因此它也是不可信的。
如果证书实际上是受信任的,那么你如何能够区分证书不被信任的情况和通过MitM攻击修改了你的代码以认为否则的情况?
因此,检查证书只有在浏览器扩展程序内部才有用(这些扩展程序被认为是可信代码),而不是在页面本身的脚本中。这种扩展程序使用的接口是特定于浏览器的,并且并非所有浏览器都提供它。例如,尽管Mozilla浏览器确实允许您窥视证书(为EFF SSL Observatory等扩展程序提供支持),但Chromium仍然缺乏该功能。