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
– firmar CSR (hombre)
-CA ca.crt -CAkey ca.key -CAcreateserial
No funciona sin -CAcreateserial
. Crea un ca.srl
archivo, donde guarda el número de serie del último certificado generado. Para agregar subjectAltName
vas 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