Diferencia entre revisiones de «SIU-Arai/certificados»

De SIU
Saltar a: navegación, buscar
(En el cliente de la API)
 
(No se muestran 5 ediciones intermedias del mismo usuario)
Línea 101: Línea 101:
 
La verificación de cliente de Apache se utiliza como parte fundamental de la autenticación de pedidos Rest entre módulos.
 
La verificación de cliente de Apache se utiliza como parte fundamental de la autenticación de pedidos Rest entre módulos.
  
Siga los siguientes pasos para configurarla.
+
=== En el cliente de la API ===
* Agregar la CA como trusted en los dos servidores. Para hacerlo ejecutar
+
Hay que agregar la CA como trusted. Para hacerlo ejecutar
 
<source lang="bash" enclose="div">
 
<source lang="bash" enclose="div">
 
cp ca.cert.pem /usr/share/ca-certificates/ca_propia.crt
 
cp ca.cert.pem /usr/share/ca-certificates/ca_propia.crt
Línea 110: Línea 110:
 
</source>
 
</source>
  
* En el archivo '''/etc/apache2/sites-enabled/default-ssl.conf'''
+
Este paso es necesario para no tener que desactivar el verify de curl desde los clientes de las APIs.
Agregar las siguientes entradas. Por ejemplo:
 
 
<source lang="apache" enclose="div">
 
<VirtualHost _default_:443>
 
    ...
 
    SSLVerifyClient optional_no_ca
 
    SSLVerifyDepth 2
 
    SSLProtocol all -SSLv2 -SSLv3
 
    SSLOptions +StdEnvVars +ExportCertData
 
    BrowserMatch "MSIE [2-6]" \
 
        nokeepalive ssl-unclean-shutdown \
 
        downgrade-1.0 force-response-1.0
 
        # MSIE 7 and newer should be able to use keepalive
 
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 
    ...
 
</source>
 
 
 
* Listo! El servidor ya está listo para validar certificados de cliente
 
 
 
= Configurando Apache con SSL =
 
No hay muchas razones para no utilizar TLS/SSL hoy en día.
 
 
 
En este artículo se dejan recursos y algunos tips de configuración para que todo funcione. De ninguna manera es '''LA''' guía de implementación. Simplemente intenta ser un lugar para aquellos que no están familiarizados con el tema.
 
 
 
* [https://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure HTTPS]
 
* [https://httpd.apache.org/docs/2.4/mod/mod_ssl.html Apache mod_ssl]
 
 
 
== Activando el módulo SSL en Apache ==
 
En Debian 8.0 la forma de activar el módulo de SSL es la siguiente
 
<syntaxhighlight lang="bash">
 
a2enmod ssl
 
</syntaxhighlight>
 
 
 
== Generando certificados válidos de prueba ==
 
Se creó una [https://github.com/SIU-Toba/docker-certs imagen de Docker] para crear de manera razonable certificados para varios servers firmados por la misma CA.
 
 
 
Para utilizarlo hay que hacer lo siguiente:
 
* Tener instaladas las últimas versiones de Docker y Docker Compose
 
* Clonar [https://gitlab.siu.edu.ar/siu/instaladores este proyecto]
 
 
 
=== Configurando el docker para generar certificados ===
 
 
 
== Sirviendo archivos con SSL ==
 
Copiar todos los certificados necesarios al directorio '''/etc/apache2/ssl'''. En este caso utilizaremos los creados para un entorno de pruebas.<br />
 
Los archivos que tenemos en este directorio son:
 
<source lang="bash" enclose="div">
 
-rw-r--r-- 1 root root 1980 nov 14 14:28 ca.cert.pem
 
-r--r--r-- 1 root root 3980 nov 14 14:28 ca-chain.cert.pem
 
-r--r--r-- 1 root root 1931 nov 14 14:26 usuarios.local.cert.pem
 
-r--r--r-- 1 root root 1704 nov 14 14:27 usuarios.local.key.pem
 
</source>
 
Vamos a configurar el host llamado '''usuarios.local'''
 
 
 
Activar el template SSL de Apache2
 
<syntaxhighlight lang="bash">
 
a2ensite default-ssl
 
</syntaxhighlight>
 
 
 
Luego hay que editar el el archivo '''/etc/apache2/sites-enabled/default-ssl.conf'''
 
* Agregar la entrada ServerName debajo de ServerAdmin. Por ejemplo:
 
 
<source lang="apache" enclose="div">
 
<VirtualHost _default_:443>
 
    ...
 
    ServerAdmin webmaster@localhost
 
    ServerName usuarios.local:443
 
    ...
 
</source>
 
* Modificar las siguientes entradas para configurar los certificados
 
<source lang="apache" enclose="div">
 
<VirtualHost _default_:443>
 
    ...
 
    SSLCertificateFile    /etc/apache2/ssl/usuarios.local.cert.pem
 
    SSLCertificateKeyFile /etc/apache2/ssl/usuarios.local.key.pem
 
    ...
 
    # aca ponemos en CA la chain que la contiene
 
    SSLCACertificateFile /etc/apache2/ssl/ca-chain.cert.pem           
 
</source>
 
 
 
* Redigir puerto 80 a 443. Hay que modificar el archivo '''/etc/apache2/sites-enabled/000-default.conf''' y agregar las siguientes líneas:
 
<source lang="apache" enclose="div">
 
<VirtualHost *:80>
 
    ...
 
    ServerName usuarios.local
 
    Redirect permanent / https://usuarios.local/
 
 
 
</source>
 
 
 
* Reiniciar apache
 
<source lang="bash" enclose="div">
 
service apache2 restart
 
</source>
 
  
* Listo! el sitio ya es accesible por HTTPS. Actualmente verá el warning de seguridad del browser. <br />Si quiere evitar esto agregue el archivo '''/etc/apache2/ssl/ca.cert.pem''' a su navegador. En Google Chrome es Configuración -> Administrar Certificados
+
Este paso se puede omitir se se usaron certificados válidos (no auto-firmados) para configurar los servidores.
== Verificando clientes con SSL ==
 
La verificación de cliente de Apache se utiliza como parte fundamental de la autenticación de pedidos Rest entre módulos.
 
 
 
Siga los siguientes pasos para configurarla.
 
* Agregar la CA como trusted en los dos servidores. Para hacerlo ejecutar
 
<source lang="bash" enclose="div">
 
cp ca.cert.pem /usr/share/ca-certificates/ca_propia.crt
 
nano /etc/ca-certificates.conf
 
# agregar ca_propia.crt al final del archivo
 
update-ca-certificates --fresh
 
</source>
 
  
* En el archivo '''/etc/apache2/sites-enabled/default-ssl.conf'''
+
=== En el servidor de la API ===
Agregar las siguientes entradas. Por ejemplo:
+
En el archivo '''/etc/apache2/sites-enabled/default-ssl.conf''' agregar las siguientes entradas.
 
   
 
   
 
<source lang="apache" enclose="div">
 
<source lang="apache" enclose="div">
 
  <VirtualHost _default_:443>
 
  <VirtualHost _default_:443>
 
     ...
 
     ...
 +
    SSLCACertificateFile /etc/apache2/ssl/ca-chain.cert.pem
 +
    # esta directiva es más laxa (ie, el valor no es 'require') porque el chequeo final se hace a nivel aplicación, no servidor
 
     SSLVerifyClient optional_no_ca
 
     SSLVerifyClient optional_no_ca
 
     SSLVerifyDepth 2
 
     SSLVerifyDepth 2

Revisión actual del 15:17 26 jul 2017

Siu-arai iso.png

Certificados

Se va a explicar como generar los certificados de cliente y servidor para lograr una instalación correcta.

A través de esta página se asume que se quieren generar los certificados con la imágen de Docker provista por el SIU. RECUERDE QUE LOS CERTIFICADOS PARA SERVERS NO VAN A SER VALIDOS (candadito rojo).

Generar certificados con imágen de Docker

Se creó una imagen de Docker para crear de manera razonable certificados para varios servers firmados por la misma CA.

Para utilizarlo hay que hacer lo siguiente:

  • Tener instaladas las últimas versiones de Docker y Docker Compose
  • Clonar este proyecto

Configurando el docker para generar certificados

Dirijirse a la carpeta certs. Dentro de este directorio hay un archivo llamado docker-compose.yml. Dentro de este archivo hay que modificar, mínimamente, dos variables: LISTA_SERVER y LISTA_CLIENTES.

  • LISTA_SERVER: Lista de dominios, separada por espacios, para los que se crearan certificados.
    Aquí van los nombres de dominios desde los que Apache va a servir sus archivos.
  • LISTA_CLIENTES: Lista de nombres, separada por espacios, a los que se les crearan certificados para actuar como clientes.
    La plataforma SIU-Araí usa como mecanismo de autenticación de APIs Rest client certificate authentication. Básicamente los servidores de las APIs guardan la clave pública de sus clientes y se apoya sobre la directiva de Apache SSLVerifyClient.
    El nombre (CN) que se ponga acá será el nombre de usuario de los consumidores de las APIs.

Una vez configurado el archivo ejecutar

docker-compose up

Esto creará una estructura de directorios dentro del directorio docker-data en la raíz del proyecto. Para extraer todas las claves a un sólo directorio plano ejecutar el siguiente comando

mkdir <path con todos los certs>
sudo find docker-data -name "*.pem" -exec cp {} <path con todos los certs> \;

Luego de seguir estos pasos ya tendremos un directorio (<path con todos los certs>) con todos los certificados que necesitaremos.

Esta herramienta se incluye como ayuda para desarrollo y testeo. No hay garantías sobre uso en producción de estos certificados.

Configurando Apache con SSL

No hay muchas razones para no utilizar TLS/SSL hoy en día.

En este artículo se dejan recursos y algunos tips de configuración para que todo funcione. De ninguna manera es LA guía de implementación. Simplemente intenta ser un lugar para aquellos que no están familiarizados con el tema.

Activando el módulo SSL en Apache

En Debian 8.0 la forma de activar el módulo de SSL es la siguiente

a2enmod ssl

Sirviendo archivos con SSL

Copiar todos los certificados necesarios al directorio /etc/apache2/ssl. En este caso utilizaremos los creados para un entorno de pruebas.
Los archivos que tenemos en este directorio son:

-r--r--r-- 1 root root 1931 nov 14 14:26 usuarios.local.cert.pem
-r--r--r-- 1 root root 1704 nov 14 14:27 usuarios.local.key.pem

Vamos a configurar el host llamado usuarios.local

Activar el template SSL de Apache2

a2ensite default-ssl

Luego hay que editar el el archivo /etc/apache2/sites-enabled/default-ssl.conf

  • Agregar la entrada ServerName debajo de ServerAdmin. Por ejemplo:
 <VirtualHost _default_:443>
    ...
    ServerAdmin webmaster@localhost
    ServerName usuarios.local:443
    SSLEngine on
    ...
  • Modificar las siguientes entradas para configurar los certificados
<VirtualHost _default_:443>
    ...
    SSLCertificateFile    /etc/apache2/ssl/usuarios.local.cert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/usuarios.local.key.pem
    ...
  • Redigir puerto 80 a 443. Hay que modificar el archivo /etc/apache2/sites-enabled/000-default.conf y agregar las siguientes líneas:
<VirtualHost *:80>
    ...
    ServerName usuarios.local
    Redirect permanent / https://usuarios.local/
  • Reiniciar apache
service apache2 restart
  • Listo! el sitio ya es accesible por HTTPS. Actualmente verá el warning de seguridad del browser.
    Si quiere evitar esto agregue el archivo /etc/apache2/ssl/ca.cert.pem a su navegador. En Google Chrome es Configuración -> Administrar Certificados

Verificando clientes con SSL

La verificación de cliente de Apache se utiliza como parte fundamental de la autenticación de pedidos Rest entre módulos.

En el cliente de la API

Hay que agregar la CA como trusted. Para hacerlo ejecutar

cp ca.cert.pem /usr/share/ca-certificates/ca_propia.crt
nano /etc/ca-certificates.conf
# agregar ca_propia.crt al final del archivo
update-ca-certificates --fresh

Este paso es necesario para no tener que desactivar el verify de curl desde los clientes de las APIs.

Este paso se puede omitir se se usaron certificados válidos (no auto-firmados) para configurar los servidores.

En el servidor de la API

En el archivo /etc/apache2/sites-enabled/default-ssl.conf agregar las siguientes entradas.

 <VirtualHost _default_:443>
    ...
    SSLCACertificateFile /etc/apache2/ssl/ca-chain.cert.pem
    # esta directiva es más laxa (ie, el valor no es 'require') porque el chequeo final se hace a nivel aplicación, no servidor
    SSLVerifyClient optional_no_ca
    SSLVerifyDepth 2
    SSLProtocol all -SSLv2 -SSLv3
    SSLOptions +StdEnvVars +ExportCertData
    BrowserMatch "MSIE [2-6]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
         # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    ...
  • Listo! El servidor ya está listo para validar certificados de cliente