Certificado SSL autofirmado no válido: "Falta el nombre alternativo del sujeto"

96

Recientemente, Chrome dejó de funcionar con mis certificados SSL autofirmados y cree que no son seguros. Cuando miro el certificado en la DevTools | Securitypestaña, puedo ver que dice

Falta el nombre alternativo del sujeto El certificado de este sitio no contiene una extensión de nombre alternativo del sujeto que contenga un nombre de dominio o una dirección IP.

Error de certificado Hay problemas con la cadena de certificados del sitio (net :: ERR_CERT_COMMON_NAME_INVALID).

¿Cómo puedo arreglar esto?

Brad Parks
fuente
33
¿Cómo no es esto una pregunta de programación? ... se trata de certificados autofirmados que forman parte de la creación de su pila. ,,, Gracias Brad
Sweet Chilly Philly
1
CN=www.example.comprobablemente esté mal. Los nombres de host siempre van en la SAN . Si está presente en el CN , entonces también debe estar presente en el SAN (en este caso, debe enumerarlo dos veces). Para conocer más reglas y motivos, consulte ¿Cómo se firma una solicitud de firma de certificado con su autoridad de certificación y Cómo crear un certificado autofirmado con openssl? También deberá colocar el certificado autofirmado en el almacén de confianza adecuado.
jww
@jww: esto no es un duplicado de esa pregunta, ya que no tiene que crear un certificado usando openssl, puede crearlo con otras herramientas.
Brad Parks
1
@BradParks - Hmmm ... La pregunta se etiquetó como OpenSSL y la respuesta aceptada usa OpenSSL. Reabrí y eliminé la etiqueta OpenSSL.
jww

Respuestas:

104

Para solucionar este problema, debe proporcionar un parámetro adicional opensslcuando esté creando el certificado, básicamente

-sha256 -extfile v3.ext

donde v3.extes un archivo como ese, %%DOMAIN%%reemplazado con el mismo nombre que usa como su Common Name. Más información aquí y aquí . Tenga en cuenta que normalmente establecería Common Namey %%DOMAIN%%en el dominio para el que está intentando generar un certificado. Entonces, si lo fuera www.mysupersite.com, entonces lo usarías para ambos.

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%

Nota: Los scripts que abordan este problema y crean certificados ssl totalmente confiables para usar en Chrome, Safari y desde clientes Java se pueden encontrar aquí.

Otra nota : si todo lo que está tratando de hacer es evitar que Chrome arroje errores al ver un certificado autofirmado, puede decirle a Chrome que ignore todos los errores de SSL para TODOS los sitios iniciándolo con una opción de línea de comando especial, como se detalla aquí en SuperUser

Brad Parks
fuente
2
No estoy seguro de qué versión de XAMPP está usando, pero si busca una línea en ese archivo que contenga "openssl x509", debería poder agregar lo anterior al final de esa línea en el archivo. Por ejemplo, esta versión de makecert.bat , lo tiene en la línea 9, y terminaría siendo: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Por supuesto, aún necesita guardarlo v3.ext en un archivo en la misma carpeta.
Brad Parks
1
Dejé Chrome después de probar todo y continué con otro navegador. Unos días después, hoy verifiqué con Chrome y funciona !!! Chrome probablemente tuvo un error y lo arreglaron. ¡Su método para el nombre alternativo del sujeto que falta funciona! Simplemente agregue el certificado bajo certificados raíz de confianza en el navegador.
Tarik
35
Estoy consiguiendo unknown option -extfile. ¿Cómo puedo solucionar esto?
Nick Manning
2
@NickManning: ¿Quizás estás usando la extfiledirectiva en el comando openssl incorrecto? En lugar de usarse en openssl req -new ..., se usa en openssl x509 -req .... Al menos eso es lo que dijo alguien aquí , lo que parece cierto por el ejemplo que tengo en otra respuesta a una pregunta similar sobre cómo generar completamente estos certificados
Brad Parks
2
"proporcionar un parámetro adicional a openssl" ¿A qué comando específicamente? Hay varios pasos involucrados y esta respuesta es demasiado vaga: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
user145400
34

La siguiente solución funcionó para mí en Chrome 65 ( ref ) -

Cree un archivo de configuración de OpenSSL (ejemplo: req.cnf)

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = company.net

Cree el certificado que hace referencia a este archivo de configuración

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
fuente
2
¡Esto es genial! Exactamente lo que necesitaba, y omite las molestas indicaciones de cosas como el nombre y el estado de la empresa, etc.
coredumperror
2
Probé algunas soluciones alternativas, pero esta es la única que funcionó para mí. ¡¡Gracias!!
Mirko
1
Puede pasar el asunto desde una línea de comandos: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
¿Cómo importaste a Chrome? ¿No basicConstraints = CA:truefalta aquí ?
woodz
19

Script de Bash

Creé un script bash para facilitar la generación de certificados TLS autofirmados que son válidos en Chrome.

Probado Chrome 65.xy todavía funciona. Asegúrese de reiniciar Chrome después de instalar nuevos certificados.

chrome://restart



Otros recursos

Otra herramienta (mucho más robusta) que vale la pena revisar es el cfsslkit de herramientas de CloudFlare :

Logan
fuente
2
Debe agregar el script aquí y explicarlo.
jww
Parece un buen guión. Pero un script no proporciona (directamente) una respuesta real sobre cuál es el problema del OP. Tal vez también explique cuál es su problema.
bshea
4

Simplemente uso el -subjparámetro agregando la dirección IP de la máquina. Así que resuelto con un solo comando.

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt

Puede agregar otros atributos como C, ST, L, O, OU, emailAddress para generar certificados sin que se le solicite.

Ludwig
fuente
2
no funciona para. parece que Chrome no reconoce SAN de esta manera
mononoke
Tengo "problemas para hacer una solicitud de certificado" en OpenSSL 1.1.0b usando este comando.
Rick
Para mí (Windows) funcionó con una sintaxis ligeramente diferente: openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS luego necesita *.pfxformato:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek
3

Tuve muchos problemas para que los certificados autofirmados funcionaran en macos / Chrome. Finalmente encontré Mkcert, "Una herramienta simple de configuración cero para crear certificados de desarrollo de confianza local con cualquier nombre que desee". https://github.com/FiloSottile/mkcert

Antonio
fuente
También funciona en mi Windows 10 en el nuevo Chrome. Aunque tuve que copiar archivos .pem de la carpeta predeterminada de Windows \ system32 a otra, porque Nginx no puede acceder a esta carpeta.
vatavale
2
  • Haga una copia de su configuración de OpenSSL en su directorio de inicio:

    cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
    

    o en Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Agregue el nombre alternativo del sujeto a openssl-temp.cnf, debajo de [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Reemplácelo localhostpor el dominio para el que desea generar ese certificado.

  • Generar certificado:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -config ~/openssl-temp.cnf
        -keyout /path/to/your.key -out /path/to/your.crt
    

A continuación, puede eliminar openssl-temp.cnf

Vic Seedoubleyew
fuente
1

Pude deshacerme de (net :: ERR_CERT_AUTHORITY_INVALID) cambiando el valor DNS.1 del archivo v3.ext

[alt_names] DNS.1 = nombre de dominio.com

Cambie domainname.com con su propio dominio.

Jun Ver
fuente
1

Aquí hay una forma muy sencilla de crear un certificado IP en el que Chrome confiará.

El archivo ssl.conf ...

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
commonName                  = 192.168.1.10

[ req_ext ]
subjectAltName = IP:192.168.1.10

Donde, por supuesto, 192.168.1.10 es la IP de red local en la que queremos que Chrome confíe.

Crea el certificado:

openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem

En Windows, importe el certificado en Trusted Root Certificate Store en todos los equipos cliente. En un teléfono o tableta Android, descargue el certificado para instalarlo. Ahora Chrome confiará en el certificado en Windows y Android.

En el cuadro de desarrollo de Windows, el mejor lugar para obtener openssl.exe es desde "c: \ Archivos de programa \ Git \ usr \ bin \ openssl.exe"

Extravagante
fuente
0

en MAC partir de Chrome Versión 67.0.3396.99 mi certificado autofirmado dejó de funcionar.

regeneración con todo lo que está escrito aquí no funcionó.

ACTUALIZAR

tuve la oportunidad de confirmar que mi enfoque funciona hoy :). Si no funciona para usted, asegúrese de que está utilizando este enfoque

v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$

copiado de aquí https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

FIN DE ACTUALIZAR

finalmente fue capaz de ver el color verde seguro sólo cuando eliminado mi certificado de sistema , y añadido a locales llavero. (si hay uno, déjelo caer primero). No estoy seguro de si importa, pero en mi caso descargué el certificado a través de Chrome y verifiqué que la fecha de creación es hoy, por lo que es el que acabo de crear.

Espero que sea útil para alguien que le dedique un día.

¡Nunca actualice Chrome!

usuario2932688
fuente
0

Si desea ejecutar su servidor localhost, debe configurar CN = localhosty DNS.1 = localhost.

[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req

[req_distinguished_name]
C = BR
CN = localhost
[email protected]
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo

[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
Washington Botelho
fuente