CLICK HERE FOR THOUSANDS OF FREE BLOGGER TEMPLATES »

Tuesday 24 February 2009

ssl

luego de instalar openssl y estar en la ruta /etc/ssl/
crearemos un directorio llamado CA y dentro crearemos otros dos llamados certificados y privado. El primero es donde se guardará una copia de cada certificado que firmemos y en el otro directorio se guardará la llave privada.

mkdir CA
cd CA
mkdir certificados privado

crear un par de archivos que en conjunto formarán la base de datos de los certificados autofirmados.
El archivo 'serial' contiene el número de serie de nuestros certificados, como apenas vamos a crear el primero su número de serie será 01, después de crearlo se actualizará a 02 y así sucesivamente.
El archivo 'index.txt' será la base de datos propiamente en base al número de serie.

echo '01' > serial
> index.txt

a continuacion mostramos un archivo de configuracion que puede ser usado
(copia el siguiente archivo dentro de CA con el nombre de openssl.cnf)

# ******************************************************************
# www.linuxtotal.com.mx
# sergio.gonzalez.duran@gmail.com
#
# Archivo de configuracion para openssl
#
# ***** openssl.cnf ******

dir = . # variable que establece el directorio de trabajo

# seccion que permite convertirnos en una CA
# solo se hace referncia a otra sección CA_default
[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial # archivo que guarda el siguiente número de serie
database = $dir/index.txt # archvio que guarda la bd de certificados
new_certs_dir = $dir/certificados # dir que guarda los certificados generados
certificate = $dir/cacert.pem # nombre del archivo del certificado raíz
private_key = $dir/privado/cakey.pem # llave privada del certificado raíz
default_md = md5 # algoritmo de dispersión usado
preserve = no # Indica si se preserva o no el orden de los campos del DN
# cuando se pasa a los certs.
nameopt = default_ca # esta opcion y la siguiente permiten mostrar detalles del
# certificado
certopt = default_ca
policy = policy_match # indica el nombre de la seccion donde se especifica que
# campos son obligatorios, opcionales y cuales deben ser
# iguales al certificado raíz

# seccion de politicas para la emision de certificados
[ policy_match ]
countryName = optional # match, obligatorio
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional # optional, campo opcional
commonName = supplied # supplied, debe estar en la petición
emailAddress = optional

[ policy_anything ]
countryName = optional # match, obligatorio
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional # optional, campo opcional
commonName = supplied # supplied, debe estar en la petición

# seccion que indica como los certificados deben ser creados
[ req ]
default_bits = 1024 # tamaño de la llave, si no se indica 512
default_keyfile = key.pem # nombre de la llave privada
default_md = md5 # algoritmo de dispersión a utilizar
string_mask = nombstr # caracteres permitidos en la mascara de la llave
distinguished_name = req_distinguished_name # seccion para el nombre distinguido (DN)
req_extensions = v3_req # seccion con mas extensiones que se añaden a la
# peticion del certificado

# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla.
# datos del propietario del certificado.
# esta seccion define el contenido de datos de id que el certificado llevara.
[ req_distinguished_name ]
0.organizationName = Nombre de la organizacion
0.organizationName_default = ostau, S.A.
organizationalUnitName = Departamento o division
emailAddress = Correo electronico
emailAddress_max = 40
localityName = Ciudad o distrito
localityName_default = Leon
stateOrProvinceName = Estado o provincia
stateOrProvinceName_default = Guanajuato
countryName = Codigo del pais (dos letras)
countryName_default = MX
countryName_min = 2
countryName_max = 2
commonName = Nombre comun (hostname o IP)
commonName_max = 64

# si en la linea de comandos se indica la opcion -x509,
# las siguientes extensiones tambien aplican
[ v3_ca ]
# indica que se trata de un certificado CA raíz con autoridad para
# firmar o revocar otros certificados
basicConstraints = CA:TRUE

# especifica bajo que metodo identificar a la llave publica que sera certificada
subjectKeyIdentifier = hash

# especifica como identifcar la llave publica
authorityKeyIdentifier = keyid:always,issuer:always

# extensiones de la opcion req
[ v3_req ]
basicConstraints = CA:FALSE # los certificados firmados no son CA
subjectKeyIdentifier = hash

[ v3_client ]
basicContraints = CA:FALSE
extendedKeyUsage = ClientAuth
# ******************************************************************

luego comprobamos en este punto lo que debes de tener el directorio CA.

> ls -l
drwxr-xr-x 2 root root 4096 ene 26 13:23 certificados
-rw-r--r-- 1 root root 0 ene 26 13:24 index.txt
-rwxr--r-- 1 root root 4776 ene 26 2006 openssl.cnf
drwxr-xr-x 2 root root 4096 ene 26 13:23 privado
-rw-r--r-- 1 root root 3 ene 26 13:23 serial

todo esta casi listo para crear el certificado raíz, recordemos que este
certificado es el que nos convertira en una autoridad certificadora CA

openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem -out cacert.pem -days 3650
-config ./openssl.cnf
Generating a 1024 bit RSA private key
....++++++
.......++++++
writing new private key to 'privado/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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.
-----
Nombre de la organizacion [ostau, S.A.]:
Departamento o division []:redes
Correo electronico []:admin@ostau.net
Ciudad o distrito [Leon]:
Estado o provincia [Guanajuato]:
Codigo del pais (dos letras) [MX]:
Nombre comun (hostname o IP) []:www.ostau.net

Lo anterior da por resultado dos archivos:
Un certificado raíz CA (cacert.pem) y una llave privada (privado/cakey.pem)
(La extensión ".pem" es de Privacy Enhanced Message)


El archivo cacert.pem es el que se puede mandar a nuestros clientes o usuarios del sistema, y que estos lo instalen o importen a su navegador, de esta manera quedaríamos como una CA más válida para el navegador y cada vez que el cliente se conecte a nuestro servidor, su navegador no mostraria el diálogo donde se pide si aceptar la conexión segurao no.

Verifiquemos el contenido del archivo cacert.pem y elcontenido de la llave privada
more cacert.pem
more privado/cakey.pem

En este punto, ya tenemos un certificado raíz que nos válida como CA, claro sin mas autoridad que nuestro propio dominio pero podemos crear certificados no solo para https, sino también spop, o simap o crear autentificación para vpn's a través de apliaciones como stunnel.
el siguiente procedimiento es crear una llave privada y una solicitud de certificado

openssl req -new -nodes -out ostau-cert.pem -config ./openssl.cnf
Generating a 1024 bit RSA private key
......................................................++++++
.......++++++
writing new private key to 'key.pem'
-----
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.
-----
Nombre de la organizacion [ostau, S.A.]:
Departamento o division []:redes
Correo electronico []:admin@ostau.net
Ciudad o distrito [Leon]:
Estado o provincia [Guanajuato]:
Codigo del pais (dos letras) [MX]:
Nombre comun (hostname o IP) []:www.ostau.net
Lo último que nos pregunto es el nombre común (CN common name), aqui es sumamente importante indicarlo igual a como esta el certificado raíz generado previamente, como se trata de un servidor web, lo correcto es poner www.ostau.net
Lo anterior genera dos archivos:ostau-cert.pem = el certificate signing request (csr) key.pem = la llave privada
verifiquemos el contenido de la solictud:
#> more ostau-cert.pem
-----BEGIN CERTIFICATE REQUEST-----
MIIBwTCCASoCAQAwRjETMBEGA1UEChMKUGF0bywgUy5BLjENMAsGA1UEBxMETGVv
bjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMCTVgwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAMMvo7xg3vmdlf/38yA68uzNq2WYTtkyecuBnUgocOqD
gc0Yl2hrfXN6lHl65kxeRFVdEBYhGgA7JoISivuDTvWwVOIxmH5HOFzZlIPIZ3xT
hHCdWUKipXhcsVCTGV+rbB1F9kkIAMrmtaNH2+Zj261jdB7eX960l1EqQaWt71dJ
AgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGVf
A/CDDXl6LQs1MH/XItqJl/8kMA0GCSqGSIb3DQEBBAUAA4GBAJH0sO7bR+dJL67p
xK5oEG9LPA2KcP+W7Vn5edpaLtUs/jYyvhQaCdSBxbMkV42nmt9DGD5p5caTFk3M
5guV9f087K+eYnUGILGQS51tXFcmYramZLETzs7nVfwGnXGsDGyKDkG6VTkx46pz
JrRTJfWBpWpo4FWg/Fi2l4E4PLv8
-----END CERTIFICATE REQUEST-----
Observa claramente que se trata de una solicitud de certificación (Certificate Request), es decir que tiene que ser firmado por una autoridad certificadora CA que somos nosotros mismos.

Por último firmaremos la solicitud que hicimos anteriormente para generar un certificado autofirmado, para firmarlo necesitaremos indicar la contraseña que autentifique que somos la CA y que por serlo tenemos la autoridad de autorizar (firmar) certificados. (Para nuestro propio uso)


#> openssl ca -out certificado-ostau.pem -config ./openssl.cnf -days 3650 -infiles ostau-cert.pem
Using configuration from ./openssl.cnf
Enter pass phrase for ./privado/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName :PRINTABLE:'ostau, S.A.'
organizationalUnitName:PRINTABLE:'redes'
localityName :PRINTABLE:'Leon'
stateOrProvinceName :PRINTABLE:'Guanajuato'
countryName :PRINTABLE:'MX'
commonName :PRINTABLE:'www.ostau.net'
Certificate is to be certified until Jan 26 00:10:10 2016 GMT (3650 days)

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#>

Se comprueba que ya aumento el número de serie a 02, es decir, el siguiente certificado que firmemos será ese número.


#> more serial
02

En el archivo index.txt el tercer campo indica 01, que es el número de serie
para el certificado recien creado y muestra también los campos del DN.
#> more index.txt
V 160126001010Z 01 unknown /C=MX/ST=Guanajuato/O=ostau, S.A./OU=redes/
CN=www.ostau.net
En el directorio de certificados se guarda también con el correspondiente número de serie (01.pem) un archivo que complementa la base de datos de certificados que podemos ir creando.
#> ls -l certificados
total 4
-rw-r--r-- 1 root root 2597 ene 27 18:10 01.pem

Y por último tenemos el certificado en si:
#> ls -l certificado-ostau.pem
-rw-r--r-- 1 root root 2597 ene 27 18:10 certificado-ostau.pem

Y podemos inspeccionarlo:
#> openssl x509 -in certificado-ostau.pem -noout -text -purpose
Instalando el certificado y la llave para Apache
Tenemos entonces dos elementos ya generados que necesitaremos para Apache: key.pem = llave privada ; certificado-ostau.pem = certificado autofirmado
Hay algunas aplicaciones (no Apache) que requieren estos dos elementos en un solo archivo, como en el caso de stunnel:
# > cat key.pem certificado-ostau.pem > key-cert-ostau.pem
Simplemente se concatenan los dos archivos en uno. Pero esto no es necesario para el caso del servidor Web Apache. Lo que hay que hacer es copiar nuestros dos archivos en un directorio, de hecho podrían quedarse donde están, es lo de menos, pero por cuestión de orden y organización vamos a copiarlos a /etc/httpd/conf que en la mayoría de distribucciones es el directorio de configuración del Apache.
NOTA IMPORTANTE: por ningún motivo los copies dentro del directorio raíz del servicio de Apache como /var/www/html ya que podrías dejar expuestos los archivos a todo el mundo y ser vulnerados.
#> cp key.pem certificado-ostau.pem /etc/httpd/conf/.
Una vez copiados los archivos, hay que crear un servidor virtual en Apache, esto dentro del archivo de configuración httpd.conf, en algunas distribucciones como Fedora y otras dentro de /etc/httpd/conf.d hay un archivo llamado ssl.conf que es donde viene un servidor virtual ya creado, se puede tomar como plantilla.

VirtualHost 192.168.1.127:443
ServerName www.pato.com
DocumentRoot /var/www/consulta
... (demás directivas del sitio)
SSLEngine on
SSLCertificateFile /etc/httpd/conf/certificado-ostau.pem
SSLCertificateKeyFile /etc/httpd/conf/key.pem
VirtualHost

Como ya había mencionado antes, si quieres evitar que a tus clientes cada vez que ingresen a tu sitio salga el molesto diálogo que pide aceptar el certificado, la única solución es que distribuyas el archivo cacert.pem, recuerda que este archivo es el que te identifica como una autoridad certificadora. Lo puedes poner a descarga desde tu propio sitio, o mandarlo por correo, como sea. Cuando el cliente lo tenga en su equipo deberá importarlo dentro del browser o navegador. Todos los navegadores en sus preferencias o herramientas tienen una opción de certificados y desde ahí existe un botón importar para realizar esto.
Pues eso es todo, si todo funcionó bien, tienes ahora un sitio con encriptación de extremo a extremo y todo el tráfico viaja seguro. (sslv2)
sslv3
crear solicitud de firmado de certificado por otra AC

generamos la peticion y al clave dentro de /etc/ssl/CA

openssl req -new -out solicitudclient.pem -keyout privado/claveclient.pem -config ./openssl.cnf

firmar la peticion del cliente

openssl ca -out firmaclient.pem -config ./openssl.cnf -extensions v3_client -days 3650 -infiles solicitudclient.pem

pero antes agregamnos las siguientes lineas en /etc/ssl/CAopenssl.cnf

[ v3_client ]
basicContraints = CA:FALSE
extendedKeyUsage = ClientAuth

luego editamos /etc/apache2/sites-available/default

y agregamos

SSLCACertificateFile /etc/ssl/CA/cacert.pem
SSLVerifyClient require

ahora exportamos el certificado con un formato p12 para que el navegador lo reconosca

openssl pkcs -export -in firmaclient.pem -inkey privado/claveclient.pem -certfile cacert.pem -out cerclient.p12