Dentro de un navegador web, es posible que JavaScript para obtener información sobre el certificado HTTPS que se utiliza para la página actual?

StackOverflow https://stackoverflow.com/questions/2402121

Pregunta

¿Hay un método para JavaScript que se ejecuta en un navegador para determinar qué certificado de CA se utiliza para autenticar el host remoto para la conexión HTTPS actual del navegador y, también obtener las propiedades de ese certificado, como el nombre de la CA

Si no es así, ¿hay otras opciones para la obtención de esta información mediante programación, tales como ActiveX, Java, CGI en el servidor, ...?

¿Fue útil?

Solución

Puede utilizar el código abierto proyecto Forge para hacer esto. Implementa SSL / TLS en JavaScript. Puede hacer una llamada AJAX al servidor y utilizar una devolución de llamada a examinar el certificado. Tenga en cuenta que el servidor es el que envía el código JavaScript para que esto no se debe utilizar para determinar uno si está o no confiar en el servidor el código JavaScript es de. El proyecto hace Forge permitir solicitudes entre dominios, por lo que si usted está usando esto para la confianza, puede cargar la Forja JavaScript desde un servidor que ya confía y luego ponerse en contacto con el servidor no lo hace todavía confianza. Sin embargo, a menos que otro servidor proporciona una política de varios dominios, usted no será capaz de realizar la solicitud de varios dominios.

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

Los enlaces de blogs en el README proporcionan más información sobre cómo se puede utilizar la fragua y cómo funciona.

Otros consejos

Copia de mi propia respuesta de ¿hay alguna manera de acceder a la información del certificado de una extensión Chrome

2018 Respuesta: Sí, en Firefox 62

Usted tendrá que hacer una WebExtension, que también se llama una extensión del navegador.

acceso a la información de seguridad en MDN

También puede consultar los documentos para:

Necesitará Firefox 62.

Aquí hay un background.js de trabajo

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>"
    ]
}

 introducir descripción de la imagen aquí

También se puede implementar en cromo vez se fusionó este código .

No. Naturalmente, también puede hacerlo con AJAX / ActiveX / Java / Flash / Silverlight y un script del lado del servidor personalizado, pero no puede ver por qué se necesita esto.


EDIT: La idea anterior es que le haga una solicitud de red (usando una de las tecnologías anteriores) al servidor y preguntar qué certificado se utiliza para esa petición a la red. Después, el servidor podría inspeccionar su propia configuración y responder a la pregunta.

Si el navegador es de alguna manera confiar en un certificado no válido y la conexión al servidor incorrecto (por ejemplo, un servidor de MITM), el servidor podría mentir. Una vez se ve comprometida mecanismo de confianza del navegador, no sé cómo evitar eso.

Por lo que yo sé, no hay manera (puramente utilizando las API del lado del cliente) para preguntar directamente al navegador qué cert se trata de utilizar "para la conexión SSL actual del navegador". Incluso Forge no hace eso. Se crea un completamente sesión paralela SSL, pero no deja de preguntar acerca de sesión SSL nativo del navegador.

JavaScript que se ejecuta en el navegador web no tiene acceso a la información del certificado. La información del certificado tampoco se pasa a través de HTTP a la aplicación. Mi investigación indica que no hay camino para la aplicación web para determinar si un hombre en el medio de ataque ha inyectado un certificado falso en algún punto entre el servidor y el cliente.

Que yo sepa, no con Javascript solo. Sin embargo, algunos servidores web permiten acceder a los parámetros de conexión del hilo o proceso. Un script serverside puede enviar esos valores, junto con la solicitud y que lo utilice.

He encontrado esto para servidor web nginx: http://wiki.nginx.org/NginxHttpSslModule (Busque en la parte inferior de la página para las variables). Debería ser posible para establecer como variables de entorno y pasarlos a sus procesos FastCGI o lo que sea que esté tomando.

AOLServer / Naviserver permite un acceso similar con el módulo nsssl.

En términos prácticos, esto tiene poco uso -? ¿Por qué necesitaría saber la información del certificado de JavaScript en el página individual ya rendido

  • Si no es de confianza, entonces, evidentemente, el código podría haber sido alterado, también, así, que no se puede confiar, tampoco.

  • Si el certificado es en realidad confianza, entonces ¿cómo ser capaz de distinguir el escenario de aquel en el certificado no es de confianza, pero su código ha sido modificado a través de un ataque MitM para pensar lo contrario?

Por lo tanto, para verificar los certificados sólo sería útil dentro de extensiones de explorador (que se supone que son de confianza de código) en comparación con las secuencias de comandos en los páginas individuales a sí mismos. Dicha interfaz que utilice las extensiones es específico del navegador, y no todos los navegadores, incluso proporciona. Por ejemplo, mientras que los navegadores Mozilla hacen permiten asomarse a los certificados (proporcionando extensiones como el Observatorio SSL FEP ), El cromo que aún falta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top