Certificado Digitales con OpenSSL I
(57565 lectures)
Por Javier Garcia
capi
(http://www.shadowsland.com)
Creado el 23/02/2006 01:51 modificado el 27/03/2006 03:03
|
Hola,
En mi web he publicado varios artículos sobre como montar certificados digitales con OpenSSL. Y me he animado a publicarlo también aquí para que llegue a un mayor número de personas.
En este artículo explico como instalar un certificado digital en el servidor apache para que podaís conectaros a vuestro servidor mediante https. Para ello creo una CA y su correspondiente certificado y hago la instalación en apache2.
Espero que os guste,
Capitán Linux. |
Pagina1/1 |
Para empezar yo trabajo con la distribución debian
por lo que la descarga de la aplicación openssl la haré
desde sus repositorios. Si alguien tiene otra distribución
solo le diré que para probar los ejemplos necesitará el
openssl, el cual se lo tendrá que bajar de la web del proyecto
o de los paquetes de su distribución de linux.
Bueno nos descargamos el paquete openssl abriendo un terminal y utilizando el maravilloso apt teclamos los siguientes comandos:
apt-get update
Con el apt-get update obtenemos las listas de las ultimas versiones de paquetes. Y ahora hacemos un:
apt-cache search openssl
Con el apt-cache search buscamos los paquetes que tengan algo llamado openssl. De la lista que nos sale , el que mas me convence es el openssl (que es lo que yo busco) , por tanto lo instalamos tecleando lo siguiente:
apt-get install openssl
Ya tenemos la herramienta openssl con la cual podremos crear nuestros certificados digitales , de forma gratuita. Comprar un certificado cuesta mucho dinero, por si no lo sabéis. ;)
Para poder crear un certificado primero tenemos que tener una CA (Autoridad Certificadora). Que es la que nos valida y confirma que nuestro certificado es valido.
Pues bien vamos a crear una CA. Para esto desde nuestra terminal ( os aconsejo crear un directorio y estar dentro de este ya que estos comandos generan ficheros ;) ) hacemos lo siguiente :
openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -days 3650 -out cacert.pem
Con este comando creamos un CA para certificados X509 con algoritmo de encriptación rsa de 2048 bytes. Con el -keyout le indicamos que la clave privada de nuestra CA se almacene en el fichero cakey.pem y la clave publica -out en el cacert.pem.
Seguidamente nos pedirá un password para nuestra CA y se lo damos. ( Apuntarlo o memorizarlo ya que sirve para los próximos pasos ). También nos pedirá una serie de datos por ejemplo país, nombre de empresa, que nos identifica como CA.
Observar que le he añadido el parámetro -days con 3650, de esta manera indicamos que la CA no expire en 10 años.
Ahora vamos a crear un certificado digital , es decir con nuestra CA creada vamos a crearnos un certificado. Podremos hacer tantos como queramos los pasos son los mismos, a partir de ahora:
Primero generamos la clave privada del que sera nuestro certificado digital:
openssl genrsa -des3 -out serv-priv.pem -passout pass:mipassword 2048
Con esto generamos la clave privada la cual tendrá un algoritmo de cifrado triple des (-des3) de 2048 y se almacenara en el fichero (-out) serv-priv.pem y con el comando -passout pass: indicamos la passfrase para nuestra clave privada yo le he puesto mipassword :)
Ahora vamos a generar la petición del certificado, antes de hacer un certificado , hay que hacer una petición donde se define el propietario del certificado.
openssl req -new -subj
"/DC=shadowsland.com/OU=com/CN=shadowsland" -key serv-priv.pem -passin pass:mipassword -out petic-certificado-serv.pem
Observamos que le indicamos (req -new) con lo que indicamos que es una petición con el parametro -subj le indicamos a quien pertenece el certificado, para ello ponemos entre comillas cada uno de los apartados que identifican separados por / , observar que yo he usado shadowsland, vosotros ponéis vuestro servidor o lo que sea. A la petición le indicamos que usara la clave privada que hemos hecho en el anterior comando -key serv-priv.pem y le indicamos el password que usemos en el anterior (-passing pass):mipassword y como salida (-out)le indicamos que genere el siguiente fichero petic-certificado-serv.perm
Finalmente ya podemos emitir el certificado. Para definir las características de un certificado openssl dispone del directorio /etc/ssl donde hay un fichero openssl.cnf con lo que podemos definir las características. Pero hay una forma mas simple de darle estas características, mediante la generación de un fichero de configuración por parte nuestra. Por tanto con VI o con nuestro editor favorito generamos un fichero que contenga lo siguiente:
basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth
Y lo guardamos por ejemplo con el nombre config1.txt , en el fichero le indicamos el basicConstraints =critical,CA:FALSE para que cumpla con el X509v3 y con la RFC3280, paja mental vamos. Lo ponemos y punto.
Y también le indicamos que el certificado servira para un servidor con lo siguiente extendedKeyUsage=serverAuth, por ejemplo un servidor web que es lo que queremos certificar.
Y ahora con el ficherito hecho con la configuración hacemos el certificadillo:
openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-certificado-serv.pem -days 3650 -extfile config1.txt -sha1 -CAcreateserial -out servidor-cert.pem
Indicamos que sera un certificado del tipo x509 cuya CA (-CA) esta definida en el fichero cacert.pem (lo hemos hecho lo primero) y que usa como clave privada (-CAkey) el fichero cakey.pem y que el certificado a generar tendrá las especificaciones definidas en el apartado anterior
(-req -in) las cuales están en el fichero de petición petic-certificado-serv.pem.
El certificado tendrá una validez de diez años (-days 3650) no valdría pasta esto ni na ;)
Y le indicamos que el certificado es para un servidor, como esto lo tenemos en nuestro fichero de configuración se lo indicamos poniendo -extfile y nuestro fichero config1.txt y utilizaremos un algoritmo de cifrado SHA (-sha1).
Luego como es nuestro primer certificado le indicamos que la Ca lo numere con lo cual le pondrá 2 , ya que el 1 es la CA -CAcreateserial y finalmente le decimos donde generar el certificado (-out) en el fichero servido-cert.pem
Una vez lanzado el comando nos pedirá el password de la CA que lo emite y el fichero se generará.
Ahora os listo los fichero generados solo los importantes
que hemos generado , el resto se puede eliminar :
Por parte de la CA:
Por parte del certificado :
Utilidad :
Vale y todo esto para que sirve, pues fácil para poder crear un
sitio certificado bajo SSL (https) con apache.
Para ello tenéis que copiar los ficheros servidor-cert.pem y servidor-priv.pem en /etc/apache2/ssl si no disponéis del directorio ssl crearlo solo sirve para guardar esto en algún
lado y que apache lo vea. Al apache2 hay que indicarle que también escuche por el puerto 443 que es el del Secure Socket Layer (ssl) para eso se modifica el fichero /etc/apache2/ports.conf para que ponga:
Listen 80
Listen 443
Ahora tenemos que decirle apache que soporte el ssl para
ello instalamos el modulo ssl: apt-get install libapache-mod-ssl
Una vez instalado esto le decimos a apache que cargue
el modulo, tecleando lo siguiente :
a2enmod ssl
Y con esto ya solo nos queda configurar nuestro fichero
de sites-availables donde tenemos nuestra configuración
para poder acceder a nuestro site mediante https.
editamos el fichero /etc/apache2/sites-availables/default y creamos el virtual host adecuado para el puerto 443 :
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/local/mipagina
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/servidor-cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/serv-priv.pem
ServerName mipagina.midominio.com
<Directory "/var/local/mipagina">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Poniendo en el DocumentRoot el lugar donde tenemos nuestra
pagina. Le indicamos que utilizamos certificados
(SSLEngine on) y le decimos donde tiene que que leer el certificado (SSLCertificateFile) y la clave privada de este (SSLCertificateKeyFile). Si no os queda algo claro de este tema consultar la instalación de apache de la pagina de jakarta.
Finalmente despues de guardar el fichero default nos vamos al /etc/apache2/sites-enabled y hacemos un vinculo simbólico al fichero default del sites-availables y le llamamos default-000
ln -s ../sites-availables/default default-000
Ahora solo nos queda parar y arrancar nuestro apache
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
Observareis que os pide password , el cual es el password
de vuestro certificado. Se lo ponéis y el servidor pim pam
pim pam se arranca. Como lo del password puede ser un problema ya que ahora si la maquina se arranca y cuando arranque el apache, se quedara parado hasta metáis el password. Pero ante todos los grandes problemas hay una solución, aunque en este caso es un poco trapera ;)
Y es ponerle en el fichero /etc/sites-availables/default
una directiva (fuera de los virtual host) como la siguiente :
SSLPassPhraseDialog exec:/etc/apache2/generadorclave
Donde generadorclave es un fichero bash que creamos nosotros para que se invoque cuando apache arranque y le proporcione la clave. El contenido del fichero podría ser el siguiente :
#!/bin/sh
echo mipassword
Observar que simplemente es un echo con el password ;)
Ahora solo le tenéis que dar permiso de ejecucion y fiesta!
chmod 700 generadorclave
Volveis a generar lo del vinculo simbolico y volveis a rearrancar
apache y ya podéis probar vuestro site poniendo
en el navegador por ejemplo https://mipagina.midominio.com
Y ya teneis la faenita hecha. ;)
|
|
|
|
|
|
Comentarios Es posible que se hayan omitido algunos comentarios considerados poco constructivos
|
1. Nombre distinguido de la Autoridad de Certificación (26/02/2006 10:21, #31197) Por: Anónimo |
Enhorabuena. Muy bien presentado. Tan solo quedaría hacer referencia a una pequeña anomlía en el uso de los nombres X500 a incluir en el certificado X509.
Según la RFC 2247, el uso del atributo DC con el dominio completo deberia separarse en varias instancias del atributo DC. Cito literalmente:
"The algorithm for transforming a domain name is to begin with an
empty distinguished name (DN) and then attach Relative Distinguished
Names (RDNs) for each component of the domain, most significant (e.g.
rightmost) first. Each of these RDNs is a single
AttributeTypeAndValue, where the type is the attribute "DC" and the
value is an IA5 string containing the domain name component.
Thus the domain name "CS.UCL.AC.UK" can be transformed into
DC=CS,DC=UCL,DC=AC,DC=UK"
Por lo que hubiese sido más conveniente utilizar:
openssl req -new -subj "/DC=shadowsland/DC=com/CN=www.shadowsland.com" -key serv-priv.pem -passin pass:mipassword -out petic-certificado-serv.pem
No obstante, a mí particularmente me gusta más el uso de los atributos O y OU, pero en ningún caso utilizaría el atributo OU (Organizational Unit) sin un atributo O (Organization), dada la dependencia jerárquica entre ambos.
openssl req -new -subj "/O=Shadowsland S.A./OU=Departamento Informatica y Telecomunicaciones/CN=www.shadowsland.com" -key serv-priv.pem -passin pass:mipassword -out petic-certificado-serv.pem
|
|
2. Re: Certificado Digitales con OpenSSL I (26/02/2006 12:58, #31198) Por: jaime (http://www.shadowsland.com) |
| Enhorabuena capi. Eres un crack. |
|
3. Re: Certificado Digitales con OpenSSL I (26/02/2006 20:08, #31202) Por: Anónimo |
| ¿No hay alguna manera de que no te pregunte contraseña, ni que haya que crear ningún bash con la contraseña?
Creo que sí:
http://slacksite.com/apache/certificate.html |
|
4. Re: Certificado Digitales con OpenSSL I (28/02/2006 18:00, #31230) Por: Entropia (http://www.entlog.org) |
| Genial!!! Simplemente genial!!! |
|
5. Re: Certificado Digitales con OpenSSL I (06/06/2007 00:53, #42644) Por: Anónimo |
| Quien me puede decir coo hacer certificados para correo firmados por CA y luego aplicar esos certificados a archivos para dejarlos firmados?
Gracias
me Email es schlesinger@cponline.org.ar |
|
|
6. Re: Certificado Digitales con OpenSSL I (05/03/2006 12:53, #31305) Por: brainstorm (http://blogs.nopcode.org/brainstorm/2005/09/25/cacert-and-ssl-server-certificate s/) |
| El artículo esta muy bien, pero no deja de ser una CA autofirmada... con lo simple que es hacerte de CAcert.org y hacer crecer el Web Of Trust... ;-) |
|
7. Re: Certificado Digitales con OpenSSL I (25/03/2006 09:22, #31601) Por: Anònim |
| Buen apunte! |
|
8. Re: Certificado Digitales con OpenSSL I (12/05/2006 14:30, #32511) Por: Anònim |
| buen apunte a un buen apunte! ;-) |
|
|
|
9. Re: Certificado Digitales con OpenSSL I (24/03/2006 21:59, #31594) Por: jonhattan |
genial!
un apunte, en vez de hacer a mano el link para habilitar el site en apache:
ln -s ../sites-availables/default default-000
se puede usar el comando a2ensite:
a2ensite default-000 y su par a2dissite default-000 :) |
|
10. Re: Certificado Digitales con OpenSSL I (08/05/2006 17:03, #32423) Por: migus |
| Enhorabuena, Capi. Excelentes los dos tutoriales. Gracias. |
|
11. Re: Certificado Digitales con OpenSSL I (10/05/2006 16:38, #32460) Por: Hug (http://hugetto.tk) |
| Buenas tengo un pequeño problema:
He seguido todos los pasos y la primera página de la web se autentifica bien pero cuando des de otro ordenador externo intento acceder a alguna de las carpeta internas de la web me dice que no tengo permisos para acceder a ella, me podriais ayudar?
Muchas grácias por adelantado! |
|
12. Re: Certificado Digitales con OpenSSL I (11/05/2006 01:16, #32480) Por: Anònim |
Mira por lo que me has dicho creo que si que es un problema de permisos.
Desde otra maquina no te funciona porque te estas conectando con el usuario con el que tu apache esta configurado. Cuando accedes por localhost , accedes con el usuario en curso
y si tienes permisos para ver lo que hay en el /var/local lo podras ver.
Haz un ls -la de los directorios a los que debe acceder tu apache y veras como tienen como propietario otro que el usuado por apache.
Al menos en Debian , el apache biene configurado para funcionar con el grupo www-data
es decir los ficheros tienes que estar asi:
rw-r--r-- 1 usuario1 www-data 5867 2005-07-05 03:16 index.html
donde usuario1 es el propietario y www-data el grupo al que pertece el fichero , por lo que al pertenecer al www-data la web te funcionaria remotamente.
Y el directorio pues lo mismo.
drwxr-xr-x 3 usuario1 www-data 280 2005-12-18 00:37 webshadowsland
Para cambiar de propietario un fichero haz de hacer un
chown usuario2.www-data fichero.html
con un usuario que tenga permisos para poder hacer esto por ejemplo root.
Aqui usuario2 es el nuevo propietario y www-data el nuevo grupo que le vas a poner
Y si lo quieres hacer recursivamente osea aplicarlo a todos los ficheros y directorios que cuelguen de un directorio haz:
chown -R usuario2.www-data directorio
donde directorio es el nombre del directorio a aplicarle el cambio de grupo y propietario.
Cualquier otra duda, aqui estamos.
Saludos.
Capi |
|
13. Re: Certificado Digitales con OpenSSL I (21/06/2006 12:03, #33341) Por: Anónimo |
| Si quieres que no te pida la PEM de tu clave privada cada vez que reinicias el Apache lo que puedes hacer es quitarla :
openssl rsa -in clavePrivconPem.key -out clavePrivsinPem.key |
|
|
|
14. Re: Certificado Digitales con OpenSSL I (12/09/2006 22:35, #34969) Por: Anònim |
| este articulo esta de lo mejor, lo he hecho al pie de la letra y no ha dado ningun trabajo.
Excelentísimo |
|
15. Re: Certificado Digitales con OpenSSL I (06/12/2006 15:37, #36984) Por: Anónimo |
| El articulo esta excelente.. sirve tambien para un servidor de correo electronico...
Que deberia hacer |
|
16. Re: Certificado Digitales con OpenSSL I (29/12/2006 17:38, #37461) Por: Anónimo |
| Solo un apunte, cuando dices que con el comando: "openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -days 3650 -out cacert.pem", creas la clave privada en cakey.pem y la clave publica en cacert.pem, no es del todo cierto.
Tanto la clave publica, como la clave privada las estas creando en el fichero cakey.pem, el fichero cacert.pem no es más que un certificado autofirmado, haciendo uso de ese par de claves que estan en cakey.pem. |
|
17. Re: Certificado Digitales con OpenSSL I (09/02/2007 23:56, #38382) Por: Anónimo |
Saludos esta muy bueno este articulo Quisiera hacer una pregunta: ¿Como hago para utilizar el webdav y poder dar permiso a usuarios a ver sus directorios? Si alquien me pudieran ayudar le estaria muy agradecido
Gracias!!!! |
|
18. Re: Certificado Digitales con OpenSSL I (21/02/2007 20:23, #38635) Por: Nando |
| Excelente articulo: util, concreto, bien explicado y funciona ! |
|
19. Re: Certificado Digitales con OpenSSL I (21/02/2007 21:21, #38638) Por: Nando |
| Saludos Capi... te molesto para hacerte una consulta. He leido por ahì que con un sòlo certificado digital no se pueden proteger varios sitio web que se encuentran en el mismo servidor. Es cierto esto ? Si lo es, se podrìan generar varios certificados en un mismo servidor y aplicar cada uno de ellos a cada sitio web ?
Gracias de antemano
Nando |
|
20. Re: Certificado Digitales con OpenSSL I (07/03/2007 10:48, #38918) Por: Anónimo |
| Realment el articulo es genial. Aun tengo alguna duda sobre como funcionan estas cosas y me pregunto si es posible generar un certificado que contenga la clave privada para firmar (firma digital) documentos. Me explico, si os dirigiis a IE -> herramientas -> opciones de internet -> contenido -> certificados ->Personal allí tengo por ejemplo un certificado para poder firmar documentos mediant firma electrónica. Este certificado realmente esta dentro de una tarjeta inteligente que la introduzco en una ranura de un lector (proporcionado por CATCert). Alguien sabe si con open ssl se puede generar un certificado con clave privada (y publica) para poder firmar documentos?
Muchas gracias de antemano y felicitar al autor del articulo dado que es de mucha gran ayuda.
Saludos |
|
21. Re: Certificado Digitales con OpenSSL I (04/04/2007 15:29, #39484) Por: Ivan Carrazana |
| Excelente articulo, tenia tiempo tratando de hacer este procedimiento. Ya estaba dispuesto a poner una sala de partos en mi habitacion... Muchas Gracias, me ha sido de mucha utilidad |
|
22. Re: Certificado Digitales con OpenSSL I (13/04/2007 04:46, #39692) Por: luis (http://www.cnt.uo.edu.cu) |
| me encanto ese tutorial de hecho resolvi el lio que tenia con los sitios de aqui ya que tengo como 10 en un solo servidor :)
gracias por compartir el conocimiento |
|
23. Re: Certificado Digitales con OpenSSL I (08/05/2007 00:01, #41189) Por: Anónimo |
| Hola Capi, en verdad yo estoy en pañales en estos temas, pero estoy investigando y necesito la opinión de un experto como tu, respecto a un problema que tengo. Mi problema es que cuando diseño macros con VBA en excel, las distribuyo a varias PC. Sucede que varias PCs tienen el excel configurado con nivel de seguridad alto y en esas condiciones la macro no surte efecto. Por eso estoy en busqueda de un certificado digital confiable para instalarlo en mi maquina y poder firmar con ese certificado las macros que cree para que cuando los distribuya no sea una condicionante si el nivel de seguridad de la PC es alto o no.
Agradecidos por su atencion y esperando una pronta repuesta a mi problema.
Saludos,
Maximo |
|