Saltar al contenido

¿Cómo hacer que el navegador confíe en el certificado SSL de localhost?

Solución:

tl; dr Genere un certificado emitido por su propia CA (consulte el script a continuación)

Esto es lo que encontré. Corrígeme donde estoy equivocado.

Hay CA (autoridades de certificación). Emiten certificados (firman CSR) para otras CA (CA intermedias) o servidores (certificados de entidad final). Algunos de ellos son autoridades de raíz. Tienen certificados autofirmados, emitidos por ellos mismos. Es decir, normalmente hay una cadena de confianza que va desde el certificado del servidor hasta el certificado raíz. Y nadie puede responder por un certificado raíz. Como tal, los sistemas operativos tienen un almacén de certificados raíz (o almacén de políticas de confianza), una lista de todo el sistema de certificados raíz de confianza. Los navegadores tienen sus propias listas de certificados de confianza, que consisten en una lista de todo el sistema más los certificados en los que confía el usuario.

En Chromium, administra los certificados en chrome: // settings / certificate. En Firefox, Preferences > Privacy & Security > Certificates > View Certificates. Ambos tienen la pestaña Autoridades, que es una lista de certificados raíz de confianza. Y la pestaña Servidores, una lista de certificados de servidor de confianza.

Para obtener un certificado, cree CSR (solicitud de firma de certificado), envíelo a CA. CA firma la CSR, convirtiéndola en un certificado de confianza en el proceso.

Los certificados y CSR son un montón de campos con información más clave pública. Algunos de los campos se denominan extensiones. El certificado CA es un certificado con basicConstraints = CA:true.

Puede inspeccionar los errores de certificado en Chromium en Developer Tools > Security.

Certificados de confianza en todo el sistema

Cuando cambia el almacén de certificados raíz del sistema operativo, debe reiniciar un navegador. Lo cambias con:

# trust anchor path/to/cert.crt
# trust anchor --remove path/to/cert.crt

trust coloca los certificados de CA en la categoría “autoridad” (trust list), o la categoría “otra entrada” de otro modo. Los certificados de CA aparecen en la pestaña Autoridades en los navegadores o en la pestaña Servidores.

Firefox no confía en los certificados de servidor del almacén de certificados raíz del sistema operativo, a diferencia de Chromium. Ambos confían en los certificados de CA del almacén de certificados raíz del sistema operativo.

Confiar en certificados en un navegador

En Chromium y Firefox puede agregar (importar) certificados a la pestaña Autoridades. Si intenta importar un certificado que no es de CA, aparece el mensaje “No es una autoridad de certificación”. Después de elegir un archivo, aparece un cuadro de diálogo donde puede especificar la configuración de confianza (cuándo confiar en el certificado). La configuración relevante para hacer que un sitio funcione es “Confíe en este certificado para identificar sitios web”.

En Chromium, puede agregar (importar) certificados en la pestaña Servidores. Pero terminan en la pestaña Autoridades (certificados de CA y no se le presenta el cuadro de diálogo de configuración de confianza después de elegir un archivo) o en la pestaña Otros (si no es un certificado de CA).

En Firefox, no puede agregar exactamente un certificado a la pestaña Servidores. Agrega excepciones. Y puede confiar en un certificado sin extensiones (pobre) allí.

Extensiones de certificado autofirmado

Mi sistema viene con la siguiente configuración predeterminada (extensiones que se agregarán) para los certificados:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

Tomado de /etc/ssl/openssl.cnf, sección v3_ca. Más sobre esto aquí.

Además, Chromium considera que un certificado no es válido cuando no tiene subjectAltName = DNS:$domain.

Extensiones de certificado no autofirmadas

De la sección [ usr_cert ] de /etc/ssl/openssl.cnf:

basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

Cuando los navegadores confían en un certificado autofirmado

Para que Chromium confíe en un certificado autofirmado, debe tener basicConstraints = CA:true, y subjectAltName = DNS:$domain. Para Firefox ni siquiera esto es suficiente:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain

Cuando los navegadores confían en un certificado emitido por la propia CA

Firefox no necesita extensiones, pero Chromium requiere subjectAltName.

openssl hoja de trucos

openssl genpkey -algorithm RSA -out "$domain".key – generar clave privada (man)

openssl req -x509 -key "$domain".key -out "$domain".crt – generar certificado autofirmado (man)

Sin -subj hará preguntas sobre el nombre distinguido (DN), como el nombre común (CN), la organización (O), la localidad (L). Puede responderlas “por adelantado”: -subj "/CN=$domain/O=$org".

Para agregar subjectAltName extensión, debe tener una configuración donde todo esté especificado, o agregar una sección a la configuración y decirle openssl su nombre con -extensions cambiar:

    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

openssl req -new -key "$domain".key -out "$domain".csr – generar RSE, puede tomar -subj opción (hombre)

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt
-CA ca.crt -CAkey ca.key -CAcreateserial
– firmar CSR (hombre)

No funciona sin -CAcreateserial. Crea un ca.srl archivo, donde guarda el número de serie del último certificado generado. Para agregar subjectAltNamevas a necesitar -extfile cambiar:

    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

openssl req -in $domain.csr -text -noout – ver CSR (hombre)

openssl x509 -in $domain.crt -text -noout – ver certificado (hombre)

Generar certificado autofirmado

(necesitará una excepción en Firefox para que funcione)

#!/usr/bin/env bash
set -eu
org=localhost
domain=localhost

sudo trust anchor --remove "$domain".crt || true

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -x509 -key "$domain".key -out "$domain".crt 
    -subj "/CN=$domain/O=$org" 
    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

sudo trust anchor "$domain".crt

Generar un certificado emitido por la propia CA

#!/usr/bin/env bash
set -eu
org=localhost-ca
domain=localhost

sudo trust anchor --remove ca.crt || true

openssl genpkey -algorithm RSA -out ca.key
openssl req -x509 -key ca.key -out ca.crt 
    -subj "/CN=$org/O=$org"

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -new -key "$domain".key -out "$domain".csr 
    -subj "/CN=$domain/O=$org"

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt 
    -CA ca.crt -CAkey ca.key -CAcreateserial 
    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

sudo trust anchor ca.crt

Configuración del servidor web

Nginx:

server {
    listen  443  ssl;
    ssl_certificate  ssl/localhost.crt;
    ssl_certificate_key  ssl/localhost.key;
    ...

Morbo:

carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' 
    site.pl

PD: estoy ejecutando Chromium 65.0.3325.162, Firefox 59.0 y openssl-1.1.0.g.

Ventanas

Aparentemente, Windows no tiene trust utilidad. En Windows, uno tiene dos tiendas: la máquina local y las tiendas de certificados de usuario actual. No tiene sentido utilizar Local Machine Certificate Store, ya que lo estamos haciendo funcionar solo para nuestro usuario actual. Luego, están las sub-tiendas. Con dos de ellos predefinidos que son de mayor interés: Trusted Root Certification Authorities y Intermediate Certification Authorities Stores. Comúnmente referido en la línea de comando como root y CA.

Puede acceder al Administrador de certificados de Chrome siguiendo chrome: // settings /? Search = Manage% 20certificates, luego haciendo clic en Administrar certificados. Lo más interesante son las pestañas Trusted Root Certification Authorities y Intermediate Certification Authorities.

Una forma de administrar certificados es a través de la línea de comandos:

>rem list Current User > Trusted Root Certification Authorities store
>certutil.exe -store -user root

>rem list Local Machine > Intermediate Certification Authorities store
>certutil.exe -store -enterprise CA

>rem GUI version of -store command
>certutil.exe -viewstore -user CA

>rem add certificate to Current User > Trusted Root Certification Authorities store
>certutil.exe -addstore -user root pathtofile.crt

>rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
>certutil.exe -delstore -user root 03259fa1

>rem GUI version of -delstore command
>certutil.exe -viewdelstore -user CA

Los resultados son los siguientes (tanto para la máquina local como para los almacenes de certificados de usuario actual):

root
    localhost.crt
        error
    ca.crt
        appears in Trusted Root Certification Authorities tab
CA
    localhost.crt
        doesn't work, appears in Other People tab
    ca.crt
        doesn't work, appears in Intermediate Certification Authorities tab

Otras opciones serían hacer doble clic en un certificado en el Explorador, importar certificados desde el Administrador de certificados de Chrome, usar Certificados MMC Complemento (ejecutar certmgr.msc), o usando CertMgr.exe.

Para los que tienen grep instalado, aquí se explica cómo comprobar rápidamente dónde está el certificado:

>certutil.exe -store -user root | grep "localhost|^root|^CA" ^
& certutil.exe -store -user CA | grep "locahost|^root|^CA" ^
& certutil.exe -store -enterprise root | grep "localhost|^root|^CA" ^
& certutil.exe -store -enterprise CA | grep "localhost|^root|^CA"

Por lo tanto, instalar el certificado CA en la tienda Usuario actual> Autoridades de certificación raíz de confianza parece ser la mejor opción. Y asegurarse no olvide reiniciar su navegador.

Lectura adicional

OpenSSL
genpkey
req
x509
Autoridad de certificación OpenSSL
Certificados para localhost
iamaCA: conviértase en su propia autoridad certificadora y otorgue certificaciones
Certificados autofirmados y de Firefox
Omitir la página de error del certificado en Chrome

En Chrome, uno puede navegar a chrome: // flags / # allow-insecure-localhost y habilitar

Permitir certificados no válidos para recursos cargados desde localhost. opción

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *