Возможно ли в веб-браузере JavaScript получить информацию о сертификате HTTPS, используемом для текущей страницы? - PullRequest
20 голосов
/ 08 марта 2010

Существует ли метод для JavaScript, выполняемый в браузере, чтобы определить, какой сертификат CA используется для проверки подлинности удаленного хоста для текущего HTTPS-подключения браузера, а также получить свойства этого сертификата, такие как имя CA?

Если нет, есть ли другие варианты программного получения этой информации, такие как ActiveX, Java, CGI на стороне сервера, ...?

Ответы [ 6 ]

17 голосов
/ 31 августа 2010

Вы можете использовать для этого открытый исходный код Forge . Он реализует SSL / TLS в JavaScript. Вы можете сделать ajax-вызов на сервер и использовать обратный вызов для проверки сертификата. Помните, что именно сервер отправляет JavaScript, поэтому его не следует использовать для определения того, доверяете ли вы серверу, с которого JavaScript. Проект Forge разрешает междоменные запросы, поэтому, если вы используете это для доверия, вы можете загрузить Forge JavaScript с сервера, которому вы уже доверяете, и затем связаться с сервером, которому вы еще не доверяете. Однако, если этот другой сервер не предоставляет междоменную политику, вы не сможете выполнить междоменный запрос.

https://github.com/digitalbazaar/forge/blob/master/README.md

Ссылки на блог в README содержат дополнительную информацию о том, как использовать Forge и как он работает.

6 голосов
/ 23 мая 2018

Копирование моего собственного ответа из Есть ли способ получить доступ к информации сертификата из расширения Chrome

2018: да, в Firefox 62

Вам понадобитсясоздать 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>"
    ]
}

enter image description here

Он также может быть реализован в Chromium после того, как этот код объединен .

2 голосов
/ 04 мая 2010

JavaScript, работающий в веб-браузере, не имеет доступа к информации о сертификате. Информация о сертификате также не передается через приложение HTTP. Мои исследования показывают, что веб-приложение не может определить, внедрила ли атака «человек посередине» фиктивный сертификат где-то между хостом и клиентом.

2 голосов
/ 08 марта 2010

Нет. Очевидно, вы могли бы сделать это с помощью AJAX / ActiveX / Java / Flash / Silverlight и специального серверного скрипта, но я не понимаю, зачем вам это нужно.


РЕДАКТИРОВАТЬ: Идея выше заключается в том, что вы должны сделать сетевой запрос (используя одну из вышеуказанных технологий) к серверу и спросить, какой сертификат был использован для этого сетевого запроса. Затем сервер может проверить свою конфигурацию и ответить на вопрос.

Если браузер каким-то образом доверяет неверному сертификату и подключается к неправильному серверу (например, серверу MITM), сервер может лгать. Когда механизм доверия браузера скомпрометирован, я не знаю, как этого избежать.

Насколько я знаю, нет способа (просто используя клиентские API) напрямую спросить браузер, какой сертификат он использует "для текущего SSL-соединения браузера". Даже Кузница этого не делает. Он создает полностью параллельный сеанс SSL, но не позволяет спрашивать о собственном сеансе SSL браузера.

1 голос
/ 08 марта 2010

AFAIK не только с Javascript. Но некоторые веб-серверы позволяют вам получить доступ к параметрам соединения потока или процесса. Затем серверный скрипт может отправить эти значения вместе с запросом, и вы его используете.

Я нашел это для веб-сервера nginx: http://wiki.nginx.org/NginxHttpSslModule (Посмотрите внизу страницы для переменных). Должна быть возможность установить их в качестве переменных среды и передать их в процессы FastCGI или все, что вы используете.

AOLServer / Naviserver обеспечивает аналогичный доступ с модулем nsssl.

0 голосов
/ 04 февраля 2014

На практике это мало что дает - зачем вам знать информацию о сертификатах из JavaScript на отдельной странице , уже созданной?

  • Если этоесли вы не доверяете, то, очевидно, ваш код тоже мог быть изменен, поэтому ему тоже нельзя доверять.

  • Если сертификат действительно является доверенным, то как вы сможете отличить его?сценарий от того, где сертификат не является доверенным, но ваш код был изменен посредством атаки MitM, чтобы думать иначе?

Таким образом, проверка сертификатов будет полезна только изнутри Расширения браузера (которые считаются доверенными кодами) в отличие от сценариев на отдельных страницах .Такой интерфейс, который используют расширения, зависит от браузера, и не все браузеры даже предоставляют его.Например, в то время как браузеры Mozilla позволяют просматривать сертификаты (предоставляя такие расширения, как EFF SSL Observatory ), Chromium по-прежнему не хватает .

...