====== Introducción ====== **OpenSSL** Secure Sockets Layer es un protocolo de la capa de aplicación que fue desarrollado por Netscape Corporation con el propósito de transmitir información confidencial, como datos de las tarjetas de crédito, a través de Internet. SSL funciona utilizando una clave privada para cifrar los datos transferidos a través de la conexión habilitada para SSL, lo que evita la escucha ilegal de la información. El uso más popular de SSL es utilizarlo junto con el navegador web (utilizando el protocolo HTTP), pero muchas aplicaciones de red pueden beneficiarse del uso de SSL. Las URL que requieren una conexión SSL comienzan con https: en lugar de http :. OpenSSL es una robusta implementación Oopen Source que habilita herramientas SSL y una biblioteca de propósito general basada en SSLeay, desarrollada por Eric A. Young y Tim J. Hudson. **X.509** X.509 es una especificación para certificados digitales publicada por la Unión Internacional de Telecomunicaciones - Telecomunicaciones (UIT-T). Especifica la información y los atributos necesarios para la identificación de una persona o un sistema informático, se utiliza para la gestión segura y la distribución de certificados firmados digitalmente a través de redes seguras de Internet. OpenSSL más comúnmente utiliza certificados X.509. ===== Instalación ===== Software relacionado con SSL: **NOTA:** la variable de entorno OPENSSL_CONF tiene que estar apuntando a "caconfig.cnf" guallar@debian:/home/guallar# export OPENSSL_CONF=/home/guallar/myCA/caconfig.cnf guallar@debian:/home/guallar# touch caconfig.cnf guallar@debian:/home/guallar# apt-get install openssl guallar@debian:/home/guallar# apt-get install ca-certificates guallar@debian:/home/guallar# apt-cache search libssl | grep SSL libssl-dev sirve para desarrollar con ssl ===== Creacion ===== **Certificados SSL** Vamos a intentan entender los conceptos implicados en la generación y uso de certificados SSL, tanto de la variedad autofirmada, como aquellos firmados por una autoridad de certificación reconocida para su uso con una aplicación de servidor que admita SSL y el uso de X. 509 certificados en aplicaciones cliente. **Certificados SSL para el uso del servidor** Una vez que haya generado correctamente un certificado SSL compatible con X.509, puede optar por firmar el certificado por uno mismo, generando una Autoridad de Certificación (CA) o puede optar por que una Autoridad de Certificación globalmente reconocida firme el certificado. Cuando el certificado está firmado, entonces está listo para ser utilizado con el kit de herramientas de OpenSSL para permitir conexiones SSL cifradas a un protocolo LDAP o HTTP, por ejemplo. vamos a describir la generación de certificados y el proceso de firma para los certificados firmados por CA y firmados por CA. **Generación y firma de certificados auto-firmados** Los certificados autofirmados tienen una gran ventaja en cuanto a que son completamente gratuitos y pueden generarse, firmarse y utilizarse según sea necesario. Los certificados autofirmados son ideales para su uso en entornos de laboratorio cerrado o para fines de prueba. Uno de los inconvenientes del uso de certificados autofirmados, es que normalmente se publica por el navegador Web y las aplicaciones las aplicaciones cliente (por ejemplo, Firefox) sacarán advertencias de abandonar la pagina por no ser segura, y sólo suprimirán dichas advertencias si los certificados que se firman utilizando una entidad de certificación reconocida y confiable a nivel mundial. El uso de certificados autofirmados en un entorno de producción accesible al público no se recomienda debido a los problemas implícitos de confianza derivados de estas advertencias, además de la posible confusión causada a los usuarios. **Creación de la autoridad de certificación** En primer lugar, se crea un entorno de trabajo inicial, por ejemplo, dentro de su directorio principal, escribiendo el siguiente comando desde el terminal: guallar@debian:/home/guallar#cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA El comando anterior lo colocará en un subdirectorio recién creado de su directorio home llamado myCA, y dentro de este subdirectorio, debería tener dos subdirectorios adicionales denominados signedcerts y private. Dentro de este entorno de trabajo inicial, la significación de los subdirectorios y su contenido es la siguiente: /home/guallar/myCA: contiene el certificado de CA, la base de datos de certificados, los certificados generados, las claves y las solicitudes /home/guallar/myCA/signedcerts: contiene copias de cada certificado firmado /home/guallar/myCA/private: contiene la clave privada A continuación, creamos una base de datos de certificados inicial en el subdirectorio /home/guallar/myCA con el siguiente comando: guallar@debian:/home/guallar/myCA# echo '01'> serial && touch index.txt Creamos el fichero de configuración home/guallar/myCA/caconfig.cnf que a continuación pongo con las opciones por defecto de la CA # My sample caconfig.cnf file. # # Default configuration to use when one is not provided on the command line. # [ ca ] default_ca = local_ca # # # Default location of directories and files needed to generate certificates. # [ local_ca ] dir = /home//myCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/signedcerts private_key = $dir/private/cakey.pem serial = $dir/serial # # # Default expiration and encryption policies for certificates. # default_crl_days = 365 default_days = 1825 default_md = md5 # policy = local_ca_policy x509_extensions = local_ca_extensions # # # Default policy to use when generating server certificates. The following # fields must be defined in the server certificate. # [ local_ca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = supplied # # # x509 extensions to use when generating server certificates. # [ local_ca_extensions ] subjectAltName = DNS:alt.tradeshowhell.com basicConstraints = CA:false nsCertType = server # # # The default root certificate generation policy. # [ req ] default_bits = 2048 default_keyfile = /home//myCA/private/cakey.pem default_md = md5 # prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions # # # Root Certificate Authority distinguished name. Change these fields to match # your local environment! # [ root_ca_distinguished_name ] commonName = MyOwn Root Certificate Authority stateOrProvinceName = NC countryName = US emailAddress = root@tradeshowhell.com organizationName = Trade Show Hell organizationalUnitName = IT Department # [ root_ca_extensions ] basicConstraints = CA:true IMPORTANTE: Tenemos que ajustar los detalles específicos del sitio en el archivo, como las dos instrucciones de /home//... en [local_ca] y [req]. También hay que cambiar commonName, stateOrProvinceName countryName, etc. en [ root_ca_distinguished_name ] para personalizar el entorno. Una vez editado el archivo modificado con nuestro entorno, lo tenemos que guardar como ~ / myCA / caconfig.cnf. A continuación, se debe generar el certificado raíz de la entidad emisora ​​de certificados y la clave, para ello, tenemos que escribir los siguientes comandos: Primero, hay que escribir: guallar@debian:/home/guallar# export OPENSSL_CONF=/home/guallar/myCA/caconfig.cnf Este comando establece una variable de entorno, OPENSSL_CONF, que obliga a la herramienta openssl a buscar un archivo de configuración en una ubicación determinada (en este caso, /home/guallar/myCA/caconfig.cnf). ===== generar ===== **Generación del certificado de la CA y de su clave privada** Ahora, generamos el certificado y la clave de la CA con el siguiente comando: guallar@debian:/home/guallar# openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825 Nos pedirá una frase de contraseña (passphrase) y veremos una salida similar a la siguiente: Generating a 2048 bit RSA private key .................................+++ .................................................................................................+++ writing new private key to '/home/guallar/myCA/private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- **IMPORTANTE** NO OLVIDAR LA CONTRASEÑA USADA ¡¡¡ La necesitaremos cada vez que deseemos generar y firmar un nuevo certificado de servidor o cliente El proceso anterior creará un certificado autofirmado que utilizará el formato PEM y el cifrado de clave pública / privada RSA. El certificado será válido por 1825 días. La ubicación y el propósito de los archivos resultantes son los siguientes: guallar@debian:/home/guallar# myCA/cacert.pem: certificado público de CA guallar@debian:/home/guallar# myCA/private/cakey.pem: clave privada de CA ==== Creación de un certificado de servidor auto-firmado ==== Ahora que tenemos una Autoridad de certificación configurada, la podemos usar para firmar certificados autofirmados. Antes de comenzar, tenemos que pensar que es posible que deseemos cifrar la clave privada del certificado con una contraseña. Las ventajas de cifrar la clave con una contraseña incluyen la protección del certificado en caso de que sea robado. El certificado no se puede utilizar con aplicaciones habilitadas para SSL sin introducir la frase de acceso cada vez que se inicia la aplicación habilitada para SSL. Para generar un certificado autofirmado y usarlo con una aplicación SSL, seguimos este proceso: Crear el archivo de configuración del servidor editando /home/guallar/myCA/exampleserver.cnf en el editor de texto. Añadir este ejemplo de contenido: # # exampleserver.cnf # [ req ] prompt = no distinguished_name = server_distinguished_name [ server_distinguished_name ] commonName = videosdeinformatica.es stateOrProvinceName = Aragon countryName = ES emailAddress = jmguallar@fundacionmontessori.com organizationName = Colegio Montessori organizationalUnitName = Departamento de Informatica Tenemos que cambiar los valores en server_distinguished_name especialmente el valor commonName. El valor commonName debe coincidir con el nombre de host, o CNAME para el host que desea utilizar la clave. Si commonName no coincide con el nombre de host previsto, los errores de incompatibilidad de host / certificado aparecerán en las aplicaciones cliente de los clientes que intenten acceder al servidor. Una vez que hayamos editado el archivo adecuadamente, lo guardamos como guallar@debian:/home/guallar# /myCA/exampleserver.cnf. Y generamos el certificado de servidor y clave con los siguientes comandos: guallar@debian:/home/guallar# export OPENSSL_CONF=/home/guallar/myCA/exampleserver.cnf Este comando establece una variable de entorno OPENSSL_CONF que obliga a la herramienta openssl a buscar un archivo de configuración en una ubicación alternativa (en este caso, /home/guallar/myCA/exampleserver.cnf). Ahora generamos el certificado y clave: guallar@debian:/home/guallar# openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM Te pedirá una contraseña y saldrá por pantalla un mensaje similar al siguiente: Generating a 1024 bit RSA private key ...++++++ ...............++++++ writing new private key to 'tempkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- **¡No olvides la contraseña!** Y se generan estos dos ficheros: la petición (tempreq.pem) y la clave privada del certificado (tempkey.pem) Ahora debe firmar el certificado de servidor con la clave de la entidad emisora ​​de certificados (CA) utilizando estos comandos: guallar@debian:/home/guallar# export OPENSSL_CONF=/home/guallar/myCA/caconfig.cnf El comando anterior modifica la variable de entorno OPENSSL_CONF que obliga a la herramienta openssl a buscar un archivo de configuración en una ubicación alternativa (en este caso, /home/gualalr/myCA/caconfig.cnf para volver a la configuración de CA). A continuación, firme el certificado como sigue: guallar@debian:/home/guallar# openssl ca -in tempreq.pem -out server_crt.pem Pedirá la contraseña de la CA creada en la configuración de la entidad emisora ​​de certificados de arriba. Introducimos la contraseña y, a continuación, nos pedirá si estamos conforme con la información de exampleserver.cnf y, finalmente, se le pide que confirmes la firma del certificado. La salida debe ser similar a esto: Using configuration from /home/guallar/myCA/caconfig.cnf Enter pass phrase for /home/guallar/myCA/private/cakey.pem: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :PRINTABLE:'videosdeinformatica.es' stateOrProvinceName :PRINTABLE:'Aragon' countryName :PRINTABLE:'ES' emailAddress :IA5STRING:'jmguallar@fundacionmontessori.com' organizationName :PRINTABLE:'colegio montessori' organizationalUnitName :PRINTABLE:'departamento informatica' Certificate is to be certified until Jan 4 21:50:08 2011 GMT (1825 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 Podemos observar que los ficheros de indices se han modificaco Ya tenemos un certificado de aplicación de servidor auto-firmado y un par de claves: server_crt.pem: archivo de certificado de la aplicación del servidor server_key.pem: archivo de clave de aplicación de servidor Si quieres utilizar el certificado en Apache2: http://codeghar.wordpress.com/2008/03/15/apache-20-in-ubuntu ==== x.509 ==== === Conversión de certificados X.509 a PKCS # 12 para aplicaciones cliente === Si desea generar certificados PKCS#12 desde el certificado raíz CA X.509 del servidor para el uso del cliente, deberemos utilizar el siguiente proceso en el certificado de servidor y el par de claves que deseamos exportar un certificado de cliente Cree un archivo único que contenga tanto el certificado como la clave con el siguiente comando: guallar@debian:/home/guallar# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem A continuación, convertimos este archivo en el certificado PKCS # 12 con el siguiente comando: guallar@debian:/home/guallar# openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "Certificado para lo que sea" Pedirá una contraseña. El archivo mycert.pfx resultante se puede importar a aplicaciones tales como navegadores Web y clientes de correo electrónico. Este certificado representa el certificado de la CA raíz de su servidor, todos los certificados de servidor subsiguientes firmados por el certificado de CA también serán aceptados automáticamente por la aplicación cliente que instala esta versión PKCS#12 del certificado. ====== Petición ====== === CREACIÓN DE UN CERTIFICADO PARA QUE SEA FIRMADO POR UNA CA RECONOCIDA EXTERNA === Generamos el certificado del siguiente modo: Si ya tenemos una clave privada guallar@debian:/home/guallar# openssl req -new -key mykey.pem -out myreq.pem Si no tenemos clave privada y queremos generar una nueva guallar@debian:/home/guallar# openssl req -new -newkey rsa:1024 -nodes -keyout mykey.pem -out myreq.pem Podemos verificar la firma con: guallar@debian:/home/guallar# openssl req -in myreq.pem -noout -verify -key mykey.pem Podemos verificar la información contenida en la petición de certificado con: guallar@debian:/home/guallar# openssl req -in myreq.pem -noout -text Se envía a la CA que debe emitir el certificado el contenido del fichero de petición de certificado y debe esperarse a que la CA emita el certificado definitivo firmado por ella === Incorporación de certificados a la base de datos de certificados del sistema === Se pueden importar certificados a la base de datos de certificados del sistema Todas las aplicaciones que utilicen esta base de datos, automáticamente confiarán en los certificados que se hallen en ella **Operación manual** Si no está instalado ya: guallar@debian:/home/guallar# apt-get install ca-certificates Copiar el certificado a guallar@debian:/home/guallar/myCA# cp mycert.pem /usr/share/ca-certificates/mycert.crt Editar el fichero guallar@debian:/home/guallar# /etc/ca-certificates.conf Añadir después del último comentario el nombre del fichero con el certificado a añadir **Operación guidada** guallar@debian:/home/guallar# dpkg-reconfigure ca-certificates guallar@debian:/home/guallar# update-ca-certificates {{ youtube>lXet6hN0o1M }} \\