Diferencia entre revisiones de «Entidad Certificadora en Ubuntu Server»
(→Preparando los directorios de la CA) |
(→Preparando los directorios y ficheros de la CA) |
||
Línea 21: | Línea 21: | ||
<pre> | <pre> | ||
+ | echo 01 > /etc/ssl/serial | ||
+ | echo 01 > /etc/ssl/crlnumber | ||
+ | touch /etc/ssl/index.txt | ||
</pre> | </pre> | ||
Revisión de 13:18 9 abr 2015
Existe ya un documento de Ubuntu que lo explica muy bien, pero como apunte personal voy a describir aquí los pasos que he seguido yo para tener una entidad certificadora propia.
También se puede consultar esta otra página de ubuntu explicando el uso de Open SSL
Contenido
- 1 Instalación de paquetes necesarios
- 2 Preparando los directorios y ficheros de la CA
- 3 Configuración de SSL
- 4 Generando certificado Raíz
- 5 Pedir un certificado nuevo a la CA
- 6 Firmando el certificado
- 7 Configurando un servidor WEB con SSL
- 8 Extensiones de los certificados
- 9 Cadena de certificados
- 10 Revocación de certificados
- 11 OCSP (Online Certificate Status Protocol)
- 12 Test de páginas con https
- 13 Más información
Instalación de paquetes necesarios
En realidad, solo he tenido que instalar el paquete openssl en mi ubuntu server 10.04LTS
Preparando los directorios y ficheros de la CA
Toda la configuración se encuentra en el fichero /etc/ssl/openssl.cnf. Antes de tocar nada ahí he creado los siguientes directorios (si no lo estaban ya)
/etc/ssl/certs /etc/ssl/crl /etc/ssl/newcerts /etc/ssl/private
También hay que crear los ficheros de DB de la CA, que se irán actualizando según vayamos firmando o revocando certificados
echo 01 > /etc/ssl/serial echo 01 > /etc/ssl/crlnumber touch /etc/ssl/index.txt
Configuración de SSL
El fichero de configuración de SSL queda como sigue:
#################################################################### [ ca ] default_ca = CA_Ardemans # The default ca section #################################################################### [ CA_Ardemans ] dir = /etc/ssl # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/CA/index.txt # database index file. #unique_subject = no # 'no' to allow creation ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/certs/ArdemansCA.pem # The CA certificate serial = $dir/CA/serial # The current serial number crlnumber = $dir/crlnumber # current crl number must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/ArdemansCAkey.pem # The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha1 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_match
Generando certificado Raíz
En nuestro caso este no será más que un certificado autofirmado, que podremos generar con el siguiente comando:
# openssl req -x509 -new -extensions v3_ca -newkey rsa:2048 -keyout ArdemansCAkey.pem -out ArdemansCA.pem -days 3650
Nos hará una serie de preguntas sobre el certificado. En el common name damos el nombre que queremos que aparezca como entidad certificadora.
Después copiamos los ficheros resultantes en el lugar que hemos especificado en el fichero de configuración.
# mv ArdemansCA.pem certs # mv ArdemansCAkey.pem private
Pedir un certificado nuevo a la CA
Para pedir un nuevo certificado firmado tendremos que crear una petición de firmado , que se llaman CSR (Certificate signing request). Para ello hay que rellenar un formulario, pero antes, vamos a crear la llave privada que vamos a firmar, para ello, podemos usar el comando openssl genrsa. La clave se puede generar de muchas formas,como por ejemplo con clave simétrica, para que solo se pueda usar si ponemos una contraseña escrita.
Creación de la clave privada
# openssl genrsa -out server.pem
Tal y como lo hemos hecho ahí arriba nos crearía un fichero con la clave que nos ha generado. Esta clave va en claro, no hay ningún tipo de encriptación sobre ella, y eso quiere decir que si nos la cogen ya podrían suplantar nuestra identidad. Por lo general lo que se suele hacer es encriptarla cuando la generamos con algún tipo de mecanismo que openssl genrsa ya tiene, por ejemplo des3:
# openssl genrsa -des3 -out server.pem.secure
o podíamos haber securizado la que hemos generado antes, ejecutando lo siguiente:
openssl rsa -in server.key -des3 -out server.key.secure
Creación del CSR
La peticion de firma de un certificado se rellena con el siguiente comando, respondiendo a las preguntas que va realizando:
root@ali:~/certificados/svn# openssl req -new -key serversvn.key -out serversvn.csr 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) [ES]: State or Province Name (full name) []:Madrid Locality Name (eg, city) []:Madrid Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ardemans Organizational Unit Name (eg, section) []: Common Name []:svn.ardemans.com Email Address []:pmblanco@ardemans.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:la de siempre facil An optional company name []:
Esto nos va a generar el fichero CSR que es que tendremos que pasar a la CA para que sea firmado.
Firmando el certificado
Ahora que ya tenemos nuestra petición tendremos que firmar el csr con nuestra CA, lo cual nos dará como resultado el certificado. Esto se puede hacer con el comando openssl ca:
# openssl ca -in serversvn.csr
Este comando nos responderá con el certificado en modo texto, que tendremos que copiar a un fichero. De todas formas lo tendremos almacenado en el directorio /etc/ssl/newcerts, tal y como hemos configurado en el fichero openssl.cnf.
Configurando un servidor WEB con SSL
Ahora que ya tenemos nuestro certificado es fácil configurar nuestro servidor WEB Apache 2 para que sirva páginas cifradas. Tendremos que copiar el certificado y la llave privada en un directorio accesible por apache. Para tenerlo organizado yo lo que hago es crearme el directorio /etc/apache2/certs y pongo dentro los dos ficheros.
En primer lugar tendremos habilitar el modulo SSL de Apache:
# a2enmod ssl
Lo único que hace este comando es crear un enlace en el dirctorio /etc/apache2/mods_enabled haciendo referencia a los ficheros mod_ssl.load y mod_ssl.conf de /etc/apache2/mods_available
Después, revisamos la configuración del fichero /etc/apache2/ports, para saber si cuando cargue este módulo va a abrir el puerto 443:
<IfModule mod_ssl.c> NameVirtualHost *:443 Listen 443 </IfModule>
Si es así, podemos ya crear un host virtual que publique por el ssl. En mi casi he creado un nuevo fichero en /etc/apache2/sites-available/ que se llama svn.ardemans.com.
<VirtualHost *:443> ServerAdmin webmaster@ardemans.com ServerName svn.ardemans.com DocumentRoot /var/www/svn.ardemans.com SSLEngine on SSLCertificateFile /etc/apache2/certs/serversvn.pem SSLCertificateKeyFile /etc/apache2/certs/serversvn.key <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory "/var/www/svn.ardemans.com"> Options FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> <Location /netapp> DAV svn SVNPath /srv/svn/netapp # SVNParentPath /srv/svn AuthType Basic AuthName "Subversion Repository" AuthUserFile /etc/apache2/dav_svn_netapp.passwd Require valid-user </Location> ErrorLog /var/log/apache2/svn/error.log CustomLog /var/log/apache2/svn/access.log combined </VirtualHost>
Extensiones de los certificados
Cada vez que firmamos un certificado le añadimos una serie de campos, a los que se le llama extensiones. Podemos definir varios gropos de extensiones en el fichero de configuración openssl.cnf y cuando firmamos un csr podemos elegir con que grupo vamos a dotar a nuestro certificado.
Por ejemplo, en mi fichero de configuración me he creado un grupo de extensiones al que he llamado server_ext:
[ server_ext ] nsCertType = server nsComment = "Certificado generado con OpenSSL" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer authorityInfoAccess = @aia_sect crlDistributionPoints = URI:http://www.ardemans.com/ssl/ArdemansCA.crl
Esos campos son los que se van a incluir como extensiones en los certificados que firme como server_ext, y además, para que sea el tipo por defecto cuando voy a firmar lo he especificado en la sección de la CA [CA_Ardemans] en el parámetro x509_extensions
Cadena de certificados
Una cosa a tener en cuenta cuando creamos certificados es que cuando ofrezcamos uno se mantenga la cadena de firmas desde la CA raiz al certificado final pasando por los CA Intermedios.
Por eso, es importante que cuando firmemos nuestro certificados con nuestra CA le asignemos la extensión que da información sobre cual es la CA que nos ha firmado. Esto se hace con la extensión authorityInfoAccess. Este campo es multivalor, y se pueden dar los datos de muchas formas. En mi caso, he creado una "subseccion" que después he asignado dentro del grupo de extensiones [ server_ext ].
El ejemplo es así:
[ server_ext ] nsCertType = server nsComment = "Certificado generado con OpenSSL" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer authorityInfoAccess = @aia_sect crlDistributionPoints = URI:http://www.ardemans.com/ssl/ArdemansCA.crl [ aia_sect ] caIssuers;URI=http://www.ardemans.com/ssl/ArdemansCA.crt
En el campo caIssuers le he dado la dirección de la llave pública de mi certificado CA raíz. Podría además especificar algun caIssuers más con otra url diferente donde tendría una copia de mi certificado. Además, en esta extensión multivalor también podría poner otros valores, como el OCSP, para comprobación on-line de certificados (alternativa a las clr)
Revocación de certificados
Puede ser que queramos revocar uncertificado, porque su clave privada ha sido comprometida o porque es un certificado que no usamos ya o que queremos dejar de darle servicio simplemente. Para hacer eso simplemente tenemos que ejecutar el comando:
# openssl ca -revoke serversvn.pem
NOTA: No estoy seguro pero creo que editando el fichero index.txt donde se almacena la base de datos de certificados expecidos y poniendo como primera letra de la fila que corresponde al certificado que queremos revocar con una R es suficiente.
Después, para que quede constancia de esta revocación de certificado hay que publicarlo en la lista CRL (certificate revokation list). Esta lista se genera con el siguiente comando:
# openssl ca -gencrl -out /etc/ssl/ArdemansCA.crl
Claro está, generar esta lista de certificados revocados y no publicarla no sirve de mucho, por ello lo que yo he hecho ha sido, aprovechando que tengo un servidor web en la mísma máqiuna donde tengo la entidad certificadora, generar en mi site http://www.ardemans.com un directorio ssl y dentro un enlace que apunta a esta lista, así que tengo la siguiente dirección que me devuelve la lista de certificados revocados:
Pero, ¿como saben las aplicaciones que usan este certificado como consultar esta lista de crl?. Pues porque en los certificados que expedimos tiene que haber una entrada en la que se indica esto. En concreto se trata de una extensión del certificado que configuramos en el fichero openssl.cnf, en la sección [ server_ext ]. La extensión se llama crlDistributionPoints, y puede albergar varias direcciones y formas de conseguir la lista CLR.
OCSP (Online Certificate Status Protocol)
Información sobre ocsp en esta página
Test de páginas con https
Existen varias páginas para realizar test de las webs con SSL, algunos ejemplos son:
Más información
Easy RSA es un conjunto de script para hacer las cosas más fáciles.