A partir de Chrome 58 ya no acepta certificados autofirmados que se basan en Common Name
: https://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category $ 3ACanary% 7Cort: relevancia% 7Cspell: falso
En cambio, requiere el uso Subject Alt Name
. He estado siguiendo previamente esta guía sobre cómo generar un certificado autofirmado: https://devcenter.heroku.com/articles/ssl-certificate-self que funcionó muy bien porque necesitaba los archivos server.crt
y server.key
para lo que estoy haciendo. Ahora necesito generar nuevos certificados que incluyen, SAN
sin embargo, todos mis intentos de hacerlo no han funcionado con Chrome 58.
Esto es lo que hice:
Seguí los pasos en el artículo de Heroku mencionado anteriormente para generar la clave. Luego escribí un nuevo archivo de configuración de OpenSSL:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
Luego generó el server.crt
con el siguiente comando:
openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650
Estoy en una Mac, así que abrí el server.crt
archivo con Keychain, lo agregué a mis Certificados del sistema. Entonces lo puse a Always Trust
.
Con la excepción del archivo de configuración para establecer el valor SAN, estos fueron pasos similares que utilicé en versiones anteriores de Chrome para generar y confiar en el certificado autofirmado.
Sin embargo, después de esto, sigo teniendo ERR_CERT_COMMON_NAME_INVALID
Chrome 58.
fuente
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')
dev.company.name
alocalhost
y esto funcionó para servir el sitio de desarrollo local de localhost. En macOS también tuve que agregar el certificado a Keychain y establecer SSL en "Always Trust".En Windows, guarde este script en su carpeta SSL como makeCERT.bat. Creará estos archivos: example.cnf, example.crt, example.key
fuente
Aquí hay una solución que me funciona:
Crear clave CA y cert
Crear server_rootCA.csr.cnf
Crear archivo de configuración v3.ext
Crear clave de servidor
Crear certificado de servidor
Agregue cert y clave al archivo de sitio Apache2, sección HTTPS (puerto 443)
Copie server_rootCA.pem del servidor a su máquina.
.. y agregarlo al navegador Chromium
TODOS ESTÁS HECHO!
PD: en lugar de crear un par de certificados de CA y servidor funcionales (según las instrucciones anteriores), simplemente puede deshabilitar los encabezados HSTS en la configuración de su servidor HTTP. Esto evitará que Chromium imponga HTTPS y permitirá a los usuarios hacer clic en "Avanzado → proceder a your.url (inseguro)" sin tener que obtener e instalar su certificado CA (server_rootCA.pem) personalizado. En otras palabras, tener que deshabilitar HSTS permitirá que su sitio se vea públicamente a través de HTTP y / o una conexión HTTPS insegura (¡cuidado!).
Para Apache2, agregue lo siguiente al archivo de sitio, sección HTTP (puerto 80)
Probado en Debian / Apache2.4 + Debian / Chromium 59
https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58
fuente
-config <( cat server_rootCA.csr.cnf )
lugar de simplemente-config server_rootCA.csr.cnf
?Hay varias respuestas excelentes que dan ejemplos de cómo hacer que esto funcione, pero ninguna que explique dónde fallaron las cosas en su intento. OpenSSL puede ser bastante no intuitivo algunas veces, por lo que vale la pena recorrerlo.
Primero, aparte, OpenSSL por defecto ignora cualquier valor de nombre distinguido que proporcione en la configuración. Si desea usarlos, debe agregarlos
prompt = no
a su configuración. Además, el comando tal como está escrito solo genera una solicitud de certificado, no un certificado en sí mismo, por lo que el-days
comando no hace nada.Si genera su solicitud de certificado con este comando que dio e inspeccionó el resultado, el Nombre alternativo del sujeto está presente:
Pero luego, si genera el certificado utilizando el comando en el enlace heroku e inspecciona el resultado, falta el nombre alternativo del sujeto:
La razón es que, por defecto, OpenSSL no copia extensiones de la solicitud al certificado. Normalmente, el certificado sería creado / firmado por una CA en base a una solicitud de un cliente, y algunas extensiones podrían otorgarle al certificado más poder del que la CA tenía la intención de confiar ciegamente en las extensiones definidas en la solicitud.
Hay formas de decirle a OpenSSL que copie las extensiones, pero en mi humilde opinión, es más trabajo que simplemente proporcionar las extensiones en un archivo de configuración cuando genera el certificado.
Si intentara usar su archivo de configuración existente, no funcionará porque la sección de nivel superior está marcada,
[req]
por lo que esa configuración solo se aplica al comando req, no al comando x509. No es necesario tener un marcador de sección de nivel superior, por lo que puede eliminar esa primera línea y luego funcionará bien tanto para generar solicitudes como para certificados.Alternativamente, puede usar el
-x509
argumento delreq
comando para generar un certificado autofirmado en un solo comando, en lugar de crear primero una solicitud y luego un certificado. En este caso, no es necesario eliminar la[req]
línea de sección, ya que esa sección es leída y utilizada por el comando req.Para recapitular, aquí está el archivo de configuración modificado utilizado en los comandos anteriores:
fuente
Mi solución es mantener el principal
openssl.cnf
como está y solo al final agregar una nueva sección como[ cert_www.example.com ]
donde www.example.com es el sitio web para el que quiero crear un certificado, y en él, ponersubjectAltName
lo que necesitaría (y Algo más). Por supuesto, la sección podría llamarse como quieras.Después de eso, puedo ejecutar el
openssl req
comando como antes, solo agrego-extensions cert_www.example.com
para que su contenido sea recogido y agrego-subj
para agregar directamente toda la información de DN.No olvide verificar el contenido del certificado después de su creación y antes de su uso, con
openssl x509 -text
fuente
Bash script con config horneado
Como un script de shell que debería funcionar en plataformas con bash. Asume el
HOSTNAME
entorno env establecido para el shell o proporciona un nombre de host de su elección, p. Ej.self_signed_cert.sh test
Lo anterior inyecta más o menos las necesidades mínimas de información de archivo de configuración openssl.
Tenga en cuenta que se incluye extra
DNS:localhost
como SAN para permitir las pruebas a través de localhost más fácilmente. Elimina ese bit extra del script si no lo quieres.Crédito
La respuesta de bcardarella es excelente (no puedo comentar / votar porque no hay suficiente representante). Sin embargo, la respuesta utiliza una ubicación de archivo de configuración openssl existente que es específica de la plataforma ... por lo tanto:
Obviamente, uno simplemente necesitaría encontrar el archivo de configuración openssl para su propia plataforma y sustituir la ubicación correcta.
Prueba
Para una forma de probar, importe
test.cert.pem
a las autoridades de Chrome enchrome://settings/certificates
y:Y después de probar
fuente