Crear certificados SSL

Una cosa es crear un certificado y otra firmarlo, de lo que se encarga una Autoridad Certificadora.

Una vez que lo hemos creado (.csr) se lo enviamos a esa entidad, la cual nos lo devolvería ya firmado (.crt).

La forma mas rápida de crearlos y firmarlos por nosotros mismos es:

openssl req -x509 -nodes -days 3650 -subj '/C=ES/ST=MADRID/L=MADRID/O=LUISMIDO/OU=Departamento de sistemas/CN=*.luismido.org/mail=gro.odimsiul|cba#gro.odimsiul|cba' \-newkey rsa:1024 -keyout key.pem -out cert.pem

Estos certificados asi creados solo deben ser usados para pruebas.
Los certificados para producción deben ser expedidos por el administrador de sistemas.

La diferencia entre firmalos nosotros y una AC es que cada vez que se entre en el dominio en el que lo hayamos hecho nosotros mismos nos preguntará si queremos añadir el certificado, ya que no somos reconocidos a nivel mundial.

Aquí explico de forma mas detallada como crear tanto los certificados como nuestra propia AC:

Crear certificados

apt-get install openssl openssl-dev

openssl req -new -nodes -out server.csr -keyout server.key

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:MADRID
Locality Name (eg, city) []:MADRID
Organization Name (eg, company) [Internet Widgits Pty Ltd]:LUISMIDO
Organizational Unit Name (eg, section) []:Departamento de sistemas
Common Name (eg, YOUR name) []:www.nombre.dominio
Email Address []:oinimod.erbmon|oirausu#oinimod.erbmon|oirausu

A challenge password []:
An optional company name []:

Esto nos crea el .csr y el .key.
La AC necesita el .csr para firmarlo y crear el .crt. (ver siguiente apartado)

Una vez firmado guardamos los 3 juntos en /root/etc/apache2/certs/www.nombre.dominio/ y configuramos apache:

vi /etc/apache2/sites-enabled/default

Añadimos:
<IfModule mod_ssl.c>
#Si el certificado tiene contraseña esta es la forma de que apache lo inserte al reiniciar sin intervenir
SSLPassPhraseDialog exec:/etc/apache2/certs/clave_cert_dominio.pl
<VirtualHost *:443>
ServerName www.nombre.dominio
ServerAlias ip_host
UseCanonicalName On

SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

SSLCertificateFile /etc/apache2/certs/www.nombre.dominio/server.crt
SSLCertificateKeyFile /etc/apache2/certs/www.nombre.dominio/server.key

ServerAdmin moc.odimsiul|con#moc.odimsiul|con

DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog /var/log/apache2/www.nombre.dominio.error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/www.nombre.dominio.access.log combined
ServerSignature Off
</VirtualHost>
</IfModule>

Contenido del fichero de la clave del certificado:

less /etc/apache2/certs/clave_cert_dominio.pl

#!/usr/bin/perl

print "clave\n";

!!! Cambiar grupo y quitar la r de otros !!!

cd /etc/apache2/certs/www.nombre.dominio/
chown root:www-data server.key
chown root:www-data server.csr
chown root:www-data server.crt
chown root:www-data clave_cert_dominio.pl
chmod o-r server.key
chmod o-r server.csr
chmod o-r server.crt
chmod o-r clave_cert_dominio.pl

Añadir su información en el /etc/apache2/sites-available/default y reiniciar apache:

/etc/init.d/apache2 restart

Creacion de certificados: http://triptico.com/docs/certificates.html

Crear AC y firmar certificados

cd /usr/lib/ssl/misc/
./CA.sh -newca

Generar llave privada server.key del certificado y request (csr) que la CA debe firmar

openssl req -new -nodes -out server.csr -keyout server.key

Hacer un backup del fichero del CA

cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.`date +%d%b%g%H%M%S`

Cambiar 365 por los dias que queremos que tenga de validez nuestro certificado.

default_days = 3650

Firmar el certificado, y obtener el server.crt

openssl ca -out server.crt -in server.csr

OpenSSL verify: http://www.herongyang.com/crypto/openssl_verify.html

Certificados Verisign

Una vez creado el fichero .csr, se lo enviamos a Verising para que cree y nos mande el .crt.

Verisign nos envía nuestro certificaco .crt, explicándonos como conseguir el intermedio, teniendo que registrarnos en su web y descargarlo, el cual es necesario para que ciertos navegadores puedan negociar el certificados automáticamente.

Para añadir el certificado intermedio, lo copiamos y pegamos delante de nuestro certificado en el mismo fichero .crt.

Ej:

El certificado utilizado se encuentra en /home/ulysse/datos/certs (wifiyo.com.crt y wifiyo.com.key), lo que se ha hecho ha sido exportarlo a un formato adecuado para el tomcat:

    # openssl pkcs12 -export -in wifiyo.com.crt -inkey wifiyo.com.key -out cert.p12 -name tomcat55

    Enter pass phrase for wifiyo.com.key:xxxxx
    Enter Export Password:xxxxxx
    Verifying - Enter Export Password:xxxxxx

Una vez creado el certificado con formato .p12, se ha copiado a la ruta del server.xml (/var/lib/tomcat5.5/conf/), y se ha configurado el conector 443:

    <Connector port="443" maxHttpHeaderSize="8192" maxThreads="150"     minSpareThreads="25" maxSpareThreads="75" enableLookups="false"     disableUploadTimeout="true" acceptCount="100" scheme="https"     secure="true" keystoreType="PKCS12" keystoreFile="conf/cert.p12"     keystorePass="xxxxxxx" clientAuth="false" sslProtocol="TLS" />

El keystorePass será el introducido al exportar el certificado (Enter Export Password)

Certificdos GeoTrust

1º Se crea el keystore y la clave privada. Para ello usamos el siguiente comando:

_$JAVA_HOME/bin/keytool -genkey -alias madridemprende.wifiya.com -keyalg RSA -keystore /home/ulysse/datos/certs/tomcat/madridemprende.reissue.store_

Este comando nos pide una serie de datos para generar el keystore:
Contraseña para el almacen de claves: La que queramos. Esta clave, sera solicitada despues en la configuracion de Tomcat.
Common Name (CN):aqui usamos el nombre de host para el que pedimos el certificado
Organizational Unit (OU):Departamento en el que trabajamos.
Organization (O): Empresa en la que trabajamos y que tiene permisos sobre el dominio o host para el que pedimos el certificado.
Locality or City (L): Ciudad en la que esta radicada la empresa.
State or Province (S): Lo mismo que antes.
Country Name (C): Codigo de Pais. En este caso España (ES).

Los datos que debemos de poner son los siguientes:

Contraseña para el almacen de claves: xxxxxx
Common Name (CN):madridemprende.wifiya.com
Organizational Unit (OU):Departamento de Sistemas
Organization (O): LUISMIDO
Locality or City (L): Madrid
State or Province (S): Madrid
Country Name (C): ES

2 detalles en este comando. El parametro "-alias" hace referencia al nombre de host para el que pedimos el certificado, en este caso "madridemprende.wifiya.com)
El parametro "-keystore" define en donde esta el fichero donde se alojan las claves. Este fichero es el que despues referenciamos en la configuracion de tomcat.

Una vez creado el keystore y la clave privada, generamos el CSR para enviar a la entidad certificadora (GeoTrust):

_$JAVA_HOME/bin/keytool -certreq -keyalg RSA -alias madridemprende.wifiya.com -file /home/ulysse/datos/certs/tomcat/madridemprende.wifiya.com.csr -keystore /home/ulysse/datos/certs/tomcat/madridemprende.reissue.store_

Este comando genera un fichero (ademas de añadirlo al keystore que tenemos definido).

cat /home/ulysse/datos/certs/tomcat/madridemprende.wifiya.com.csr

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBxzCCATACAQAwgYYxCzAJBgNVBAYTAkVTMQ8wDQYDVQQIEwZNQURSSUQxDzANBgNVBAcTBk1B
RFJJRDEOMAwGA1UEChMFR09XRVgxITAfBgNVBAsTGERlcGFydGFtZW50byBkZSBzaXN0ZW1hczEi
MCAGA1UEAxMZbWFkcmlkZW1wcmVuZGUud2lmaXlhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
gYkCgYEA1cVamJP5fWqpHJqIFtD2E0TQCzHxC3SeEyshnZVhIFmubFdLN5jXz7iGSfgO4Vx2IdgS
I+K7xtQt8mEe8Pii4bk5oUgXCqBLE4bwlX/6dgimlj5erIfRPRACsF5mqJMgGR4ifeqRDrzzO5Sq
rxLme6zJotCdgJ6Sm964Mew3k1cCAwEAAaAAMA0GCSqGSIb3DQEBBQUAA4GBALiKX0FiIwCuC2z9
gZMKE2dxm0PFpIkGiC7AmoU3Ek4ZvRiDLXqOHWhgSb45oEtcxXBGsEHOujNyXwjXthxw1MPDcD+N
6gkI3jPFCGedfpsDqx9upnXrByay+Yl0TkGVl6wkogJfa+blwGdpSC18YrRjNQtFZXKqh/uGZC9H
0wXT
-----END NEW CERTIFICATE REQUEST-----

Este fichero es el que tenemos que usar para generar el certificado. Se incluira desde la linea que contiene -BEGIN NEW CERTIFICATE REQUEST- hasta la que contiene -END NEW CERTIFICATE REQUEST- incluidas.

Una vez hemos enviado el CSR a GeoTrust, recibimos via mail el certificado. El certificado sin la clave privada no sirve para nada, si alguien lo intercepta no tendra mayor importancia, salvo que intercepten la clave privada, en ese caso se podria explotar el certificado.

El certificado es algo asi:

cat  /home/ulysse/datos/certs/tomcat/madridemprende.wifiya.com.crt

-----BEGIN CERTIFICATE-----
MIIDnjCCAwegAwIBAgIDExYDMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwNTI2MTgyMzA4WhcNMTEwNTI4MTAwNjUx
WjCCAQExKTAnBgNVBAUTIEY5UGpPa0Z4T2Y4Mkd5WHovT1JWMDhYRnJKeDVCN05K
MQswCQYDVQQGEwJFUzEiMCAGA1UEChMZbWFkcmlkZW1wcmVuZGUud2lmaXlhLmNv
bTETMBEGA1UECxMKR1QzNTcyNTMwNTExMC8GA1UECxMoU2VlIHd3dy5nZW90cnVz
dC5jb20vcmVzb3VyY2VzL2NwcyAoYykxMDE3MDUGA1UECxMuRG9tYWluIENvbnRy
b2wgVmFsaWRhdGVkIC0gUXVpY2tTU0woUikgUHJlbWl1bTEiMCAGA1UEAxMZbWFk
cmlkZW1wcmVuZGUud2lmaXlhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA1cVamJP5fWqpHJqIFtD2E0TQCzHxC3SeEyshnZVhIFmubFdLN5jXz7iGSfgO
4Vx2IdgSI+K7xtQt8mEe8Pii4bk5oUgXCqBLE4bwlX/6dgimlj5erIfRPRACsF5m
qJMgGR4ifeqRDrzzO5SqrxLme6zJotCdgJ6Sm964Mew3k1cCAwEAAaOB1DCB0TAf
BgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAOBgNVHQ8BAf8EBAMCBPAw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMCQGA1UdEQQdMBuCGW1hZHJp
ZGVtcHJlbmRlLndpZml5YS5jb20wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2Ny
bC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVjYS5jcmwwHQYDVR0OBBYEFLU4E+58
bl3GGAZM+2khDAhhUxm4MA0GCSqGSIb3DQEBBQUAA4GBAGv2QjWiNRiaOgn+v3t3
wPqdDmwEIeFztWBOKBFjtf7pp9MJVwrtqYrXJsCWIrzp6oVvGt14OmAO2RstcV7U
IBWnQ5PQqA/Jww8btApASm3jWV6TUvs6TmmyJB9YvzEYse+7htJY1XtzEnncal7q
vCGrG2o0HoLCOWVJOHfjszg/
-----END CERTIFICATE-----

Lo unico que tenemos que hacer ahora es meter este certificado en el mismo keystore que hemos creado con anterioridad:

_$JAVA_HOME/bin/keytool -import -alias madridemprende.wifiya.com -trustcacerts -file madridemprende.wifiya.com.crt -keystore madridemprende.reissue.store_

Hemos de recordar poner siempre el "-alias" con el host que vamos a proteger con el certificado, y el keystore que que hemos creado anteriormente.

Una vez hecho esto solo nos queda editar el fichero server.xml de la configuracion de tomcat

vi /usr/share/tomcat5.5/conf/server.xml

Buscamos el conector https para incluir el certificado:

    <Connector port="443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true" keystoreFile="/home/ulysse/datos/certs/tomcat/madridemprende.reissue.store" keystorePass="xxxxxx"
               clientAuth="false" sslProtocol="TLS" />

Se añaden los parametros keystoreFile="/home/ulysse/datos/certs/tomcat/madridemprende.reissue.store" keystorePass="xxxxxx"

La clave es la misma que hemos definido durante la creacion del certificado. Por defecto, el puerto https de tomcat es el 8443, que hay que cambiar al 443 que es el puerto standard https en los navegadores de internet.

Una vez hecho esto, se reinicia tomcat y se comprueba que todo funciona con normalidad.

Certificados en Jetty

http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

« Linux

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License