Criptografía con curvas elípticas




Lección 1. Criptosistemas basados en el problema del logaritmo discreto
Lección 2. Curvas elípticas en seguridad web
Lección 3. Criptografía con emparejamientos
Lección 4. Protocolos criptográficos con curvas elípticas





Lección 2: Curvas elípticas en seguridad web Fecha de publicación: 03/09/2105
Francesc Sebé - Grupo de Investigación Cryptography & Graphs: www.cig.udl.cat, Universitat de Lleida.


Temario

Apartado 2.1. Almacén de autoridades de certificación
Apartado 2.2. Creación de claves para criptografía de curvas elípticas
Apartado 2.3. Instalación del certificado
Apartado 2.4. Conexión segura con el servidor web
Apartado 2.5. Referencias bibliográficas

En los últimos años, cada vez más gestiones son realizadas de forma telemática a través de un navegador web. Entre ellas se incluyen la lectura de correo electrónico, reserva y compra de títulos de transporte, búsqueda y reserva de alojamiento en hoteles y apartamentos, realización de transacciones bancarias, presentación de tributos, compartición de ficheros, etc.


Muchas de estas gestiones involucran la utilización de datos personales y/o la realización de transacciones económicas. Por tanto, es fundamental que puedan llevarse a cabo de forma segura.


El protocolo TLS (Transport Layer Security) fue diseñado y creado para dotar de seguidad a las comunicaciones en Internet. En la actualidad es conocido por su utilización en comunicaciones web seguras. TLS es un protocolo IETF (Internet Engineering Task Force) definido por primera vez el año 1999 [TLS10] tomando como base a su predecesor SSL (Secure Sockets Layer). Desde entonces ha experimentado distintas revisiones y actualizaciones [TLS11][TLS12].


TLS permite que los dos participantes en una comunicación web, el servidor y el navegador, establezcan una conexión segura utilizando criptografía de clave pública y de clave compartida. En el modo de utilización más habitual, en el momento de establecer una conexión, el servidor se autentica mediante el envío de una clave pública certificada. El navegador, validará la validez de la clave pública recibida, y en caso de aceptarla, iniciará un proceso que culmina con el establecimiento de una conexión segura entre servidor y navegador a través de la cual se realizará el intercambio de datos.


En esta lección mostraremos cómo crear una clave pública certificada, en formato X.509, utilizando criptografía de curvas elípticas mediante la herramienta OpenSSL. Después realizaremos su instalación en un servidor web Apache2. El acceso al servidor se llevará a cabo utilizando un navegador web Firefox.




APARTADO 2.1. ALMACÉN DE AUTORIDADES DE CERTIFICACIÓN


La criptografía de clave pública permite que un emisor y un receptor se comuniquen de forma segura a través de un canal inseguro sin necesidad de haber compartido ninguna información secreta de antemano. En el caso concreto de una comunicación confidencial, se requiere que el receptor disponga de una clave pública que debe mandarse al emisor. Este envío puede realizarse a través de un canal inseguro, pues las propiedades de la criptografía de clave pública permiten que ésta pueda caer en manos de un adversario sin que esto afecte a la seguridad de la comunicación. Sin embargo, el emisor de dicha comunicación debe obtener alguna garantía de que la clave pública que recibe pertenece realmente al receptor con quien quiere comunicarse. Sin estas garantías podría ocurrir que un atacante le haga llegar una clave pública de la cual conoce la clave privada asociada. De este modo, el atacante podría descifrar los datos transmitidos.


La solución más utilizada para resolver esta problemática se basa en la existencia de las denominadas autoridades de certificación. Una autoridad de certificación es una entidad en quien todo el mundo confía. Su tarea consiste en emitir los denominados certificados de clave pública.


El proceso es el siguiente. Una entidad crea una clave privada y su clave pública asociada. Entonces genera un mensaje que contiene su clave pública juntamente con un conjunto de datos que le identifica. Este mensaje, llamado petición de certificado se envía a la autoridad de certificación quien se encargará de verificar la correctez de todos los datos. Si todo es correcto, esta autoridad firmará el mensaje anterior. El resultado es el denominado certificado de la clave pública.


Cualquier participante que recibe una clave pública certificada por una entidad en quien confía obtiene la garantía de que la clave privada correspondiente a la clave pública que aparece en el certificado está en posesión de la entidad cuyos datos constan en el certificado.


En una comunicación web segura basada en la utilización de TLS, el servidor se autentica mediante una clave pública certificada. Las autoridades de certificación en quienes confía un navegador web se hallan en su almacén de autoridades de certificación. En el caso del navegador web Firefox, podemos observar el contenido de este almacén accediendo a: Preferences - Advanced - Certificates - View Certificates.


Para la elaboración de esta lección hemos creado una autoridad ficticia y la hemos instalado en nuestro almacén. A continuación, mostramos los datos de dicha autoridad:




Figura 1. Datos del certificado de la autoridad de certificación ficticia que utilizaremos en esta lección

En la siguiente figura podemos observar que la autoridad ficticia que hemos creado tiene una clave pública RSA. Esta es la clave que utilizará nuestro navegador para verificar la firma de los certificados emitidos por esta autoridad.




Figura 2. Tipo de clave (RSA) de la autoridad de certificación ficticia que utilizaremos en esta lección



APARTADO 2.2. CREACIÓN DE CLAVES PARA CRIPTOGRAFÍA DE CURVAS ELÍPTICAS


En este apartado veremos como utilizar la herramienta OpenSSL para crear de un par de claves privada/pública para criptografía de curvas elípticas.


Tal como se ha explicado en la Lección 1, en criptografía sobre curvas elípticas, lo primero que debe hacerse es escoger una curva que sea criptográficamente segura. La herramienta OpenSSL permite la utilización de un conjunto de curvas estándar adecuadas para su uso criptográfico. A continuación mostramos el comando necesario para ver esta lista de curvas.


$openssl ecparam -list_curves




Figura 3. Resultado de solicitar a OpenSSL que nos muestre la lista de curvas elípticas que soporta

Es importante tener en cuenta que los servidores y los navegadores web no soportan todas las curvas ofrecidas por OpenSSL. En el documento RFC 6460 se indica que una conexión TLS establecida mediante criptografía sobre curvas elípticas debe utilizar la curva secp256r1 o la secp384r1. Por tanto, la elección de una curva distinta conlleva el riesgo de que no sea soportada. En esta lección utilizaremos la segunda de estas curvas.


Una vez hemos escogido una curva, procederemos a crear un par de claves privada/pública sobre ella mediante el comando que mostramos a continuación. Las claves generadas serán almacenadas en el fichero privada_serv.pem.


$openssl ecparam -name secp384r1 -genkey -out privada_serv.pem

Para ver el contenido del fichero resultante, podemos ejecutar el comando:


$openssl ec -in privada_serv.pem -text -noout

Como resultado podemos ver como efectivamente el fichero contiene un par de claves sobre la curva elíptica secp384r1. La clave privada (de 384 bits) y su clave pública asociada se muestran en codificación hexadecimal.




Figura 4. Contenido de un fichero que almacena un par de claves (privada y pública) para criptografía con curvas elípticas

El siguiente paso es la creación de una petición de certificado para nuestra clave pública. Recordemos que una petición de certificado es un fichero que incluye una clave pública junto con los datos de la entidad que posee la clave privada asociada. En esta lección supondremos que deseamos crear un certificado para el sitio web www.paginaweb.es gestionado por el Grupo de Investigación CiG de la Universidad de Lleida. Esta petición se genera mediante el comando:


$openssl req -new -sha256 -key privada_serv.pem -subj "/C=ES/CN=www.paginaweb.es/O=Universidad de Lleida/OU=Grupo de Investigacion CiG" -out certificado_serv.req

En el comando anterior hemos indicado que la petición se almacene en el fichero certificado_serv.req. A continuación mostramos el contenido de este fichero.


$openssl req -in certificado_serv.req -text -noout




Figura 5. Contenido de un fichero de petición de certificado

El comando nos muestra los datos del propietario de la clave pública (campo Subject) así como la clave pública codificada en hexadecimal (campo Public-key). Puede observarse que estamos trabajando con la curva secp384r1. La firma digital que se muestra al final ha sido calculada con la clave privada que corresponde a la clave pública que se pretende certificar. De este modo la autoridad de certificación se asegura de que el solicitante de la petición conoce la clave privada y además se garantiza que una vez el fichero ha sido creado, ninguno de sus datos pueda verse alterado.


Este fichero deberemos mandarlo a la Autoridad de Certificación. Esta Autoridad comprobará la autenticidad de los datos y, si todo es correcto, emitirá su certificado firmado por ella.




APARTADO 2.3. INSTALACIÓN DEL CERTIFICADO


En este momento, la Autoridad de Certificación ya ha emitido nuestro certificado. Nos lo manda en el fichero certificado_serv.crt. Podemos ver su contenido mediante el siguiente comando:


$openssl x509 -in certificado_serv.crt -text -noout




Figura 6. Contenido del fichero con el certificado de la clave pública

El campo Issuer muestra los datos de la autoridad que ha emitido este certificado. El campo Subject muestra los datos del propietario de la clave pública certificada. En nuestro ejemplo podemos ver que se trata de un certificado que vincula una clave pública al sitio web www.paginaweb.es. Se puede comprobar que la clave pública es exactamente la misma que figuraba en nuestra petición de certificado. En cuanto a la firma de la autoridad, podemos ver que se trata de una firma RSA. Como hemos visto al inicio de esta lección, la autoridad dispone de una clave RSA. Con esta clave ha firmado un certificado que contiene una clave para criptografía de curvas elípticas.


Una vez disponemos de un certificado para nuestra clave pública, es momento de instalarlo en nuestro servidor web. Este servidor es el que atiende las peticiones dirigidas al sitio web ficticio www.paginaweb.es. Para que nuestro servidor atienda peticiones de conexión segura TLS debemos instalarle el módulo adecuado (comando a2enmod ssl). Después, debemos copiar el fichero con el certificado y el fichero con la clave privada en las ubicaciones que se indican en el fichero de configuración del servidor web Apache2. Finalmente reiniciamos el servidor.




Figura 7. Parte del fichero de configuración del servidor web Apache2 donde se indica la ubicación del certificado con la clave pública y el fichero con la clave privada



APARTADO 2.4. CONEXIÓN SEGURA CON EL SERVIDOR WEB


A partir de este momento ya podemos establecer conexiones seguras con nuestro servidor web. Para ello, iniciamos un navegador y accedemos al sitio https://www.paginaweb.es. Mediante https indicamos que queremos establecer una conexión web segura. Durante el establecimiento de la conexión segura, el servidor envía su clave pública certificada al navegador. Dado que la clave pública ha sido certificada por una autoridad en quien nuestro navegador confía, la conexión se establece sin generar ningún aviso de seguridad.




Figura 8. Establecimiento de una conexión segura

El candado que aparece junto a la URL indica que los datos que estamos visualizando se han transmitido a través de una conexión segura. Si pulsamos sobre el candado el navegador nos muestra información sobre esta conexión.




Figura 9. Información sobre la conexión segura

En la Figura 9 podemos ver que estamos conectados con un servidor que atiende las peticiones del sitio www.paginaweb.es y cuya clave pública ha sido certificada por una autoridad de la Universidad de Lleida (en este caso ficticia). En la parte inferior de la figura se indica que los datos de la comunicación se transmiten cifrados. Pulsando sobre el botón View certificate el navegador nos muestra el certificado con la clave pública del servidor.




Figura 10. Información del certificado del servidor. Se muestra que la clave pública se ha definido sobre una curva elíptica

En la figura vemos que el certificado para el sitio www.paginaweb.es ha sido emitido por una autoridad llamada Autoridad de Certificación. En la parte inferior se muestra que la clave pública del servidor se ha definido sobre la curva elíptica secp384r1.




APARTADO 2.5. REFERENCIAS BIBLIOGRÁFICAS


[Apache] The Apache HTTP Server Project. httpd.apache.org/


[Firefox] Mozilla Foundation. https://www.mozilla.org/es-ES/


[IETF] The Internet Engineering Task Force. https://www.ietf.org/


[OpenSSL] OpenSSL: The Open Source Toolkit for SSL/TLS. https://www.openssl.org


[TLS10] T. Dierks, C. Allen, "The TLS Protocol Version 1.0", RFC 2246, January 1999. https://www.ietf.org/rfc/rfc2246.txt


[TLS11] T. Dierks, E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.1", RFC 4346, April 2006. https://www.ietf.org/rfc/rfc4346.txt


[TLS12] T. Dierks, E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, August 2008. https://www.ietf.org/rfc/rfc5246.txt


[TLSSuiteB] M. Salter, R. Housley, "Suite B Profile for Transport Layer Security (TLS)", RFC 6460, August 2008. https://www.ietf.org/rfc/rfc6460.txt


[X509] Unión Internacional de Telecomunicaciones. Recomendación X.509. https://www.itu.int/rec/T-REC-X.509/es