Pesadilla creando un certificado SSL autofirmado que funciona

Pesadilla creando un certificado SSL autofirmado que funciona

Tengo un servidor de intranet y necesito instalar un SSL.

Este es elopenssl.cnf

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
req_extensions          = req_ext
#prompt = no

[ req_distinguished_name ]
countryName                     = US
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = CHICAGO
localityName                    = CHICAGO
0.organizationName              = MY COMPANY
organizationalUnitName          = IOS DEVELOPMENT
commonName                      = server2.myserver.local
commonName_max                  = 64
emailAddress                    = [email protected]
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = password
challengePassword_min           = 4
challengePassword_max           = 20

[ req_ext ]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = server2.myserver.local
DNS.2   = myserver.local

Estos son los comandos que estoy usando para crearlo.

  1. generando la clave CA raíz

    openssl genrsa -des3 -out rootCA.key 4096
    

2.esto está generando el certificado de CA raíz

openssl req \
    -x509 -new -nodes \
    -key rootCA.key -sha256 \
    -days 825 \
    -out rootCA.crt \
    -subj /CN=server2.myserver.local \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:server2.myserver.local')) \
    -extensions 'req_ext'
  1. generando la clave del certificado

    openssl genrsa -out mydomain.com.key 4096
    
  2. generando el certificado

    openssl req -new -sha256 -key  mydomain.com.key \
     -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=server2.myserver.local" \
     -reqexts SAN \
     -config <(cat ./openssl.cnf \
         <(printf "\n[SAN]\nsubjectAltName=DNS:server2.myserver.local,DNS:myserver.local")) \
     -out mydomain.com.csr
    
  3. convertir el certificado CA a p12

    openssl pkcs12 -export -out ca.p12 -inkey rootCA.key -in rootCA.crt  
    
  4. convirtiendo el certificado a p12

    openssl pkcs12 -export -out certificate.p12 -inkey mydomain.com.key -in mydomain.com.crt
    

Luego instalo ca.p12y certificate.p12en mi servidor IIS y en mis dispositivos.

Cuando trato de visitarserver2.myserver.local

yo obtengo

ingrese la descripción de la imagen aquí

¿Cómo, en nombre de Saint Certificate, hago eso?

Respuesta1

Yo diría que su certificado de CA raíz es completamente incorrecto. Los certificados de CA son muy diferentes de los certificados TLS del host final: no se puede utilizar la misma configuración para ambos.

  • No pongas el dominio del servidor en el asunto, eso es inútil. Si es una CA, debería tenerlo CN=My internal CAo algo así.

  • Agrega la basicConstraintsextensión. Debe decir que el certificado es una CA.

  • Añade lo correcto keyUsage. Debe tener 'keyCertSign' y (solo para completar) 'cRLSign'.

  • No agregues subjectAltName. ¡El certificado es para una autoridad/emisor, no para el servidor!

  • No agregues extendedKeyUsage. A veces se utiliza para limitar qué certificados puede emitir la CA, pero es mejor empezar sin esta complejidad.

  • Es una buena idea agregar subjectKeyIdentifier, en caso de que luego termine teniendo varias CA internas con DN de asunto idénticos. (Normalmente, los DN de CA deben ser únicos, pero tener SKI/AKI lo relaja un poco).

Por lo tanto, debería tener un archivo de configuración "CA" que se parezca más a este (y dejar de agregar SAN y otras cosas a través de la línea de comando; para eso es la configuración):

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
req_extensions          = req_ext

[ req_dn ]
countryName             = US
stateOrProvinceName     = Chicago
organizationName        = Company Name
organizationalUnitName  = iOS development
commonName              = Internal development CA

[ req_ext ]
basicConstraints        = critical, CA:TRUE
keyUsage                = keyCertSign, cRLSign
subjectKeyIdentifier    = hash

Mientras que el certificado de entidad final (servidor TLS) debería tener estas extensiones:

...
[ req_ext ]
basicConstraints        = CA:FALSE
keyUsage                = digitalSignature, keyEncipherment
extendedKeyUsage        = serverAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid, issuer
subjectAltName          = DNS:server2.myserver.local

Luego instalo ca.p12 y certificado.p12 en mi servidor IIS y en mis dispositivos.

¡No instales la clave privada de la CA en tus dispositivos!Tampoco lo instales en el servidor. Deberías instalarsoloel certificado CA rootCA.crt(la parte pública) y nada más.


Mi recomendación final: no pierda el tiempo intentando crear CA con archivos raw openssl. En lugar de usarfácil-RSA(el que viene con OpenVPN), o usarXCA(aplicación gráfica de Linux), o utilice una de lasposiblemente docenasde programas ya escritos y probados.

información relacionada