OpenSSL: ¿cómo generar una CSR con nombres alternativos de sujeto (SAN) solicitados interactivamente?

11

Deseo configurar OpenSSL de tal manera que cuando se ejecute openssl req -newpara generar una nueva solicitud de firma de certificado, se me solicite que se incluyan nombres de temas alternativos en la CSR.

He agregado esta línea a la [req_attributes]sección de mi openssl.cnf:

subjectAltName                  = Alternative subject names

Esto tiene el efecto deseado que ahora se me solicita para SAN cuando se genera una CSR:

$ openssl req -new -out test.csr -key ./test.key                            <<<
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:
State or Province Name (full name) [New York]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Example Co]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:test.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Alternative subject names []:DNS:alt1.example.com

En el ejemplo anterior, ingresé DNS:alt1.example.comcuando se me solicitaron las SAN.

El problema es que la CSR resultante no parece estar bien formateada:

$ openssl req -text -in ./test.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=US, ST=New York, O=The Banes, CN=test.thebanes.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    [...]
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:unable to print attribute

OpenSSL se queja de que no puede imprimir el valor del atributo Nombre alternativo del sujeto. A partir de ejemplos en línea (donde las personas codifican las SAN en su openssl.cnf, en lugar de solicitarlas de forma interactiva como quiero), espero ver esto en su lugar:

        Attributes:
            X509v3 Subject Alternative Name:
                DNS:alt1.example.com

Entonces, ¿cómo puedo generar una CSR bien formada con SAN interactivas?

Maxy-B
fuente
Desafortunadamente, creo que no hay una solución para hacer eso con "puro" openssl: necesitaría un script que altere su archivo de configuración para eso. :( PD: una solución comprobada para hacerlo de manera no interactiva está aquí: stackoverflow.com/a/9158662/2693875
Greg Dubicki

Respuestas:

4

He luchado con esta pequeña pepita ... ¡qué PITA!

Mi solución: moví todo el archivo openssl.cnf a un archivo Template Toolkit dejando solo la pieza sans como pieza de reemplazo, luego envolví un script perl alrededor.

El script perl solicita las entradas de SAN, luego las inserta en la plantilla, guarda la plantilla en un archivo temporal y luego llamo a openssl req con la opción -config apuntando al archivo temporal. descarte el archivo temporal después de que se genere la CSR.

También es posible que desee ver: http://www.openssl.org/docs/apps/config.html

Hay otros que anulan $ ENV justo antes de la ejecución y envuelven la llamada a openssl req en perl o shell y logran lo mismo de una manera un poco más eficiente: http://blog.loftninjas.org/2008/11/11/ configurando-ssl-request-with-subjectaltname-with-openssl /

Paul Allen
fuente
La solución $ ENV no funcionó para mí. :(
Greg Dubicki
2

También estoy buscando una solución. Y esto es lo que quieres:

[req]
default_bits      = 2048
default_key_file  = private.key.pem
...
...
attributes        = req_attributes

[req_attributes]
subjectAltName = Alternative DNS names, Email adresses or IPs (comma seperated list)
#optional default value
subjectAltName_default = DNS:myhost.com.au,IP:127.0.0.1,EMAIL:[email protected]

Y puede obtener esto solicitando nombres alternativos de sujeto :)

#openssl req -in mytest1/temp.csr.pem -noout -text
    Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=DE, ST=Sachsen, L=Heidenau, O=IT Rab\xC3\xB6se, OU=ssl
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d8:cd:14:ca:d0:06:6c:8c:11:e9:52:bc:46:39:
                    c1:cf:5a:6e:dd:3b:a8:85:15:6b:13:82:82:4a:48:
                    cb:53:ea:70:ea:f4:02:b2:ef:b1:41:b2:d7:11:c7:
                    11:ba:07:1b:be:8c:30:bc:60:d2:82:83:a1:e1:19:
                    75:3b:69:03:01:3c:2b:7b:85:f4:2e:a9:58:68:8f:
                    0e:f4:5e:50:e1:3f:9e:cf:46:a0:eb:69:aa:1e:cb:
                    3a:99:cb:1d:93:60:d0:3b:38:96:87:45:19:51:f4:
                    40:72:e5:a7:5e:62:37:41:44:48:64:47:95:14:97:
                    4f:27:d0:0c:e7:6f:c1:e1:37
                Exponent: 65537 (0x10001)
        Attributes:
            X509v3 Subject Alternative Name:DNS:www.google.de,EMAIL:[email protected]
    Signature Algorithm: sha1WithRSAEncryption
        9d:2b:e4:eb:1b:c0:b6:0b:b4:62:a7:4d:01:68:98:68:36:98:
        1e:e9:bc:59:24:0f:1b:32:7b:da:9d:39:a4:0f:2c:70:3e:aa:
        f7:07:e7:6b:9b:3b:00:b3:71:e0:54:07:78:c7:6e:57:e3:89:
        07:e1:93:f1:77:e7:cc:0e:d0:ed:c5:d0:a3:5d:1a:cd:bb:d8:
        5f:64:25:81:1b:a8:2f:ef:c7:84:7a:f6:b8:52:4e:4c:1c:8d:
        83:b7:9b:02:8e:b2:39:68:a1:fe:f1:59:8b:e0:c4:91:f1:a9:
        c7:b3:82:a3:d2:92:2b:e5:79:9f:29:b6:63:e7:cf:9d:17:98:
        fe:70
Raiserle
fuente
Esto funciona cuando se mira la CSR, pero cuando creo un certificado, no conserva la SAN.
Jess
Si el formato correcto para SAN? Lista separada por comas. Verifique solo con DNS con prefijo SAN, si no es compatible con IP, EMAIL. Ejemplo: ENTRADA >>DNS:my.dns.com, DNS:my.otherdns.org
raiserle
Okay. Esta es la función normal de openssl wtf ! También debe proporcionar la SAN al CAcomando como -extensions <string>, o -extfile <file>. mta.openssl.org/pipermail/openssl-users/2016-January/…
raiserle
1

Este "subjectAltName" no debe estar en esta sección: atributos = req_attributes. Pero en una sección para req_extensions = (llámalo como quieras).

Y no hay necesidad de todas las BS como

subjectAltName           = Alternative subject names
subjectAltName_default   = DNS:www.g00gle.com

Solo escribe lo que quieres, cuántos quieres:

subjectAltName = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

(El último hace acceso interno como " https://192.168.1.2 " sin previo aviso)

Entonces algo como:

[ req ]
req_extensions     = my_extensions

[my_extensions]
subjectAltName     = DNS:*.g00gle.com, DNS:g00gle.com, DNS:192.168.1.2

¡Salud!

MXW
fuente
1
Esto NO es lo que solicitó OP: quería una solución interactiva .
Greg Dubicki
1
¿No deberían registrarse las IP utilizando "IP: 192.168.1.2", no un registro en formato DNS? Observé esta discusión de 2013 sobre errores entre navegadores cuando se usa DNS o IP para almacenar direcciones IP como SAN ( michaelm.info/blog/?p=1281) , pero este error ya debería haberse eliminado.
Chris Woods