Para que un certificado sea realmente útil lo debería firmar una entidad emisora de certificados raíz (CA). 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: Establece el asunto del certificado
una vez obtenido 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 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
KonstantinMiller
How soon will you update your blog? I’m interested in reading some more information on this issue.
lenox
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)
jeffto
Muchas gracias por este tutorial, me funcionó muy bien. Un mega abrazo de agradecimiento.
Agustín Sanc
Gracias por el tutorial la verdad seguí todos los pasos y me funcionó perfectamente….
Saludos Cordiales
Sarbani
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.
Ronald
Gracias amigo por el tutorial… Me sirvio a la primera…
Qwenci
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.
RODOLFOLP
NO ME SIRVE, ME PIDE ENTER PEM PASS PHRASE. mE PUEDE AYUDAR?. ESTO SIRVE PARA APACHE? TODAVIA NO INSTALO EL APACHE. gracias
andres
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?
Mohomad
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.