Creando certificados autofirmados con openssl

Para que un certificado sea realmente útil lo debería firmar una entidad emisora de certificados raíz. Con openssl podemos crear un certificado autofirmado (certificado raíz) y después usarlo para firmar otros certificados creados a posteriori.

Cero: Ser administrador o tener permisos de escritura en la carpeta del openSSL

Uno: Creación de nuestra propia autoridad certificadora (CA)

openssl req -x509 -newkey rsa:2048 -keyout mi_ca_privado.pem -out mi_ca_publico.pem -days 3650

  • -x509: Certificado autofirmado
  • -newkey: Generar nueva clave privada y nueva solicitud de certificado
  • rsa:2048: RSA con 2048 bits
  • -keyout: Clave privada
  • -days: válidez 10 años
  • -out: Clave pública

Dos: Creación de un certificado (clave privada + petición para autoridad certificadora)

openssl req -newkey rsa:2048 -subj "/DC=midominio.com/OU=com/CN=micertificado" -keyout mi_cert_privado.pem -out mi_cert_publico_peticion.pem

  • -subj: Estable tema asunto del certificado

Con el archivo ‘mi_cert_publico_peticion.pem’ nos deberíamos ir a una autoridad certificadora para que nos lo firmasen, pero nosotros usaremos nuestra CA creado en el punto anterior

Tres: Creación fichero de configuración para la firma de la petición con nuestra CA

En este punto hay que crear un fichero (p. ej. config.txt) de configuración con las siguientes líneas:

  • basicConstraints=critical,CA:FALSE

Esta línea indica que el certificado que vamos a firmar es para usuario final, es decir, no se podrán firmar otros certificados con él.

Así mismo podemos añadir la siguiente línea según el uso que le queramos dar al certificado

  • extendedKeyUsage = ver_tabla
 Valor                  Significado
-----                  -----------
serverAuth             SSL/TLS Web Server Authentication.
clientAuth             SSL/TLS Web Client Authentication.
codeSigning            Code signing.
emailProtection        E-mail Protection (S/MIME).
timeStamping           Trusted Timestamping
msCodeInd              Microsoft Individual Code Signing (authenticode)
msCodeCom              Microsoft Commercial Code Signing (authenticode)
msCTLSign              Microsoft Trust List Signing
msSGC                  Microsoft Server Gated Crypto
msEFS                  Microsoft Encrypted File System
nsSGC                  Netscape Server Gated Crypto

Cuatro: Firma de la petición con nuestra CA

openssl x509 -CA mi_ca_publico.pem -CAkey mi_ca_privado.pem -req -in mi_cert_publico_peticion.pem -days 3650 -sha1 -CAcreateserial -out mi_cert_publico_firmador_por_mi_ca.pem -extfile config.txt

  • x509: Se puede usar entre otras cosas para firmar certificados
  • -CA: Clave pública del CA
  • -CAkey: Clave privada del CA
  • -req: Fichero con la petición
  • -days: Periodo de validez (10 años)
  • -sha1: Firma el certificado con -sha1
  • -CAcreateserial: Añade un número de serie a los certificados firmados con nuestra CA
  • -out: Certificado de salida (lo que queremos)
  • -extfile: Fichero con parámetros de configuración

Con todo tendremos los siguiente ficheros con claves privadas para guardarlo bajo llave:

  • mi_ca_privado.pem
  • mi_cert_privado.pem

Finalmente podemos usar el siguiente comando para meter la clave privada y la pública en el mismo fichero PKCS#12:

openssl pkcs12 -export -in mi_cert_publico_firmador_por_mi_ca.pem -inkey mi_cert_privado.pem -out pkcs_12_cert.pfx

y éste se puede usar por ejemplo en IPsec (pero eso ya es otra historia)

  • mi_ca_publico.pem
  • mi_cert_publico_firmador_por_mi_ca.pem

Aquí dejo un script linux para intentar automatizar todo esto (cada cual es responsable de su uso):


#!/bin/bash
echo ---------------------
echo CREANDO CLAVE PRIVADA
echo ---------------------
echo introduce el nombre del certificado CA:
read ca_name
echo introduce el password del CA ; read CApass
ca_name_priv=$(echo $ca_name)_priv.pem
ca_name_pub=$(echo $ca_name)_pub.pem
openssl req -x509 -newkey rsa:2048 -passout pass:"$CApass" -keyout $ca_name_priv -out $ca_name_pub -days 365
echo ---------------------
echo CREANDO CLAVE PUBLICA
echo ---------------------
echo introduce el nombre del certificado que vamos a crear:
read cert_name
echo introduce el password del certificado ; read CERTpass
cert_name_priv=$(echo $cert_name)_priv.pem
cert_name_pub=$(echo $cert_name)_pub.pem
cert_name_pet=$(echo $cert_name)_pet.pem
echo introduce el Distinguished Name del certificado (Ej: /DC=midominio,/DC=com,/CN=certificador):
read dn
openssl req -newkey rsa:2048 -subj "$dn" -passout pass:"$CERTpass" -keyout $cert_name_priv -out $cert_name_pet
echo -----------------------
echo FIRMANDO EL CERTIFICADO
echo -----------------------
openssl x509 -CA $ca_name_pub -passin pass:"$CApass" -CAkey $ca_name_priv -req -in $cert_name_pet -days 3650 -sha1 -CAcreateserial -out $cert_name_pub
echo ---------------------------
echo CONVIRTIENDO EL CERTIFICADO
echo ---------------------------
openssl pkcs12 -export -in $cert_name_pub -passin pass:"$CERTpass" -inkey $cert_name_priv -out $cert_name.pfx

Referencias:
http://www.openssl.org
BULMA: Certificado Digitales con OpenSSL I
Certificate Management with OpenSSL – General Stuff

← Entrada anterior

Entrada siguiente →

10 Comentarios

  1. How soon will you update your blog? I’m interested in reading some more information on this issue.

  2. Hi,
    I would like to thank you for your interest. At this moment, that’s all. Anyway
    you can follow the post links (they are really interesting)
    May be in the future, I will write about OpenSSL (It is really related to
    this post)

  3. Muchas gracias por este tutorial, me funcionó muy bien. Un mega abrazo de agradecimiento.

  4. Agustín Sanc

    Gracias por el tutorial la verdad seguí todos los pasos y me funcionó perfectamente….

    Saludos Cordiales

    • Yes, SSH is very safe!And I am quite aware of how alternate ports for the sshd.Most of the time this guide is like rieevnnt the wheel. I did not do the tunneling due to security issues in ssh but to pass through tightly secured proxies and firewalls. On larger companies, security department usually only allow internet traffic on http and https (ssl) through a forward proxy.Then you have two ways to go.1. Tunnel ssh over http; Then you must cope with all strange hacks a forward proxy might do. Adding headers etc.2. Or do some tricks over https proxy connect with ssl, one could be my solution above.

  5. Gracias amigo por el tutorial… Me sirvio a la primera…

    • And this post is all the more interesting that Saul Christie frgoot to mention that Apache’s mod_proxy_connect has a bug, which may only be corrected by applying a patch to Apache at compile time, which prevents using proxytunnel over https. So the only way, without recompiling apache to do what you need is the way you very simply explained it above. Thanks.

  6. RODOLFOLP

    NO ME SIRVE, ME PIDE ENTER PEM PASS PHRASE. mE PUEDE AYUDAR?. ESTO SIRVE PARA APACHE? TODAVIA NO INSTALO EL APACHE. gracias

  7. hola, una consulta, necesito crear certificados para una TSA y cuando firmo la publica de la TSA, el apache no me la reconoce y da error!

    alguna ayuda?

    • Great post. I get’ exactly why you need to tennul SSH over stunnel as you’ve described here. I’m currently working with a very tricky proxy server that won’t allow a connection directly to an SSHD server because it requires SSL handshaking, otherwise it drops the connection. Using stunnel I can now get the correct SSL protocol and still use SSH too.

Deja un comentario