Usando SSL con Apache2 + OpenSSL como CA, procesando CSR, y Certificado
Situación Presentada
Una ex-compañera de trabajo me dijo que le habían solicitado en la empresa pasar sus sitios web intranet a HTTPS cómo motivo de baseline según nuevas politicas de seguridad informatica.
Y qué hacemos entonces?
Cada terminología se va a explicar brevemente para conocimiento general, pero esta entrada se enfocará en la creación del archivo de solicitud de certificado CSR y proceso de firmarlo con una CA authority y finalmente instalación del CRT resultante de esto, en los servidores web, que son Apache2. Se configurará una una entidad certificadora interna corriendo como Root CA, tambien una breve muestra de como usar una entidad certificadora pública.(Let's Encrypt)Componentes del articulo
1. Pre-requisitos para instalación 1.1 Requisitos CenTOS 8
1.2 Requisitos Ubuntu 20.04
2. Firewall
2.1 Ubuntu 20.04
2.2 CentOS 8
3. Terminología y conceptos de HTTPS, PKI, y CertificadosSSL usados
4. Preparacion Apache2 HTTPS y forzar Redirect
4.1 Ubuntu 20.04
4.2 CentOS 8
5. Crear Private Key y CSR.
5.1 Generar Llave
1.2 Requisitos Ubuntu 20.04
2. Firewall
2.1 Ubuntu 20.04
2.2 CentOS 8
3. Terminología y conceptos de HTTPS, PKI, y CertificadosSSL usados
4. Preparacion Apache2 HTTPS y forzar Redirect
4.1 Ubuntu 20.04
4.2 CentOS 8
5. Crear Private Key y CSR.
5.1 Generar Llave
5.1.1 Usando alrogitmo RSA
5.1.2 Usando algoritmo ECDSA
5.2 Generar CSR
6. Creación de Certificado con CA .
6. Creación de Certificado con CA .
6.1 Usando CA Interno
6.1.1 Crear una entidad certificadora interna
6.1.2 Firmar (Crear) crear Certificado con CA interno
6.1.3 Habilitar CA Interno en almacen de certificados.
6.1.3.a En Linux
6.1.3.b En Windows
6.1.4 Visualización de Certificado
6.1.4.a En Linux
6.1.4.b En Windows
6.2 Usando CA Publico
8. Pruebas de certificado.
1. Pre-requisitos para instalación
•Un PC con CentOS 8 o Ubuntu 20.04, usados en este tutorial.
•Una conexión de red a internet (cableada preferiblemente)
•Un Apache2 webserver corriendo, ya que no se cubrira aqui.
•Conocimiento basico de shell de Linux
1.1 Pre-requisitos CentOS 8•Conocimiento basico de shell de Linux
•Actualizar repositorios e instlara el repositorio EPEL tambien.
sudo yum install epel-release
sudo yum update
sudo yum update
* Nota: Si aparece un error indicando que no puede sincronizar, ejecutar lo siguiente:
sudo dnf update -y --releasever=8
1.2 Pre-Requisitos Ubuntu 20.04
• Actualizar repositorios:
sudo apt update
apt install php libapache2-mod-php
* Nota: Si aparece un error indicando que no puede sincronizar, ejecutar lo siguiente:
sudo dnf update -y --releasever=8
1.2 Pre-Requisitos Ubuntu 20.04
• Actualizar repositorios:
sudo apt update
apt install php libapache2-mod-php
2. Configurar Firewall
Si no está hecho ya, se debe abrir el puerto tcp/443 (https) para que funcione el , ya que posteriormente se hará un redireccionamiento forzado desde el puerto tcp/80 (http) .
Si no se está usando firewall, omitir paso, sin embargo es fuertemente aconsejable, y casi mandatorio tenerlo activo.
**NOTA: La red que uso en mi laboratorio es la 192.168.116.0/24 , configurada en este post
Permitir Inbound:
tcp/80- HTTP (porque si , para probar la redireccion )
tcp/443 - HTTPS
2.1 Ubuntu
La configuracion que se usará para el servidor web, será la siguiente (en caso de ya estar configurados algunas reglas, omitirlas y pasar a la de HTTPS ,la última).
La configuracion que se usará para el servidor web, será la siguiente (en caso de ya estar configurados algunas reglas, omitirlas y pasar a la de HTTPS ,la última).
En Ubuntu El firewall esta deshabilitado por default.
Para habilitarlo, y configurarlo a lo minimo, ejecutaremos los siguientes comandos:
Crear las reglas generales con el principio de Denegacion Implicita para prevenir accesos no autorizados.
sudo ufw default allow outgoing
sudo ufw default deny incoming
Para habilitarlo, y configurarlo a lo minimo, ejecutaremos los siguientes comandos:
Crear las reglas generales con el principio de Denegacion Implicita para prevenir accesos no autorizados.
sudo ufw default allow outgoing
sudo ufw default deny incoming
Agregar excepcion para conectarnos por SSH, desde nuestra red:
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 22 comment 'aceptar trafico SSH a NUESTRA red'
Agregar excepcion para el servicio web que habrá (HTTP/HTPS), desde nuestra red:
sudo ufw allow 80/tcp comment 'aceptar trafico web HTTP de TODOS'
sudo ufw allow 443/tcp comment 'aceptar trafico web HTTPS de TODOS'
sudo ufw allow proto tcp from 192.168.116.0/24 to any port 22 comment 'aceptar trafico SSH a NUESTRA red'
Agregar excepcion para el servicio web que habrá (HTTP/HTPS), desde nuestra red:
sudo ufw allow 80/tcp comment 'aceptar trafico web HTTP de TODOS'
sudo ufw allow 443/tcp comment 'aceptar trafico web HTTPS de TODOS'
2.2 CentOS
Se ejecutará lo mismo que en el inciso anterior para Ubuntu, pero con la sintaxis del firewall para CentOS:
Agregar nuestra red actual a la zona:
Se ejecutará lo mismo que en el inciso anterior para Ubuntu, pero con la sintaxis del firewall para CentOS:
Agregar nuestra red actual a la zona:
sudo firewall-cmd --zone=public --permanent --add-source=192.168.116.0/24
Agregar reglas con excepciones:
SSH:
sudo firewall-cmd --zone=public --permanent --add-port=22/tcpHTTP/HTTPS
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --reload
Se confirman los cambios:
sudo firewall-cmd --zone=public --list-all
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --reload
Se confirman los cambios:
sudo firewall-cmd --zone=public --list-all
3. Breve explicación de HTTPS, PKI y Certificados SSL
Esto es una explicación (muy rápida) de como funciona el mecanismo SSL/TLS, en caso de ser necesario.
Esto lo que hacen es encriptar el tráfico entre el usuario, y el sitio web, y así prevenir que la data sea vista a simple vista por softwares que pueden inspeccionar paquetes (e.g. cómo ver trafico HTTP con Wireshark ).
Los componentes, siglas y conceptos utilizados en este intercambio son los siguientes:
PKI (Public Key Infraestructure ó Infraestructura de Llave Publica)
Es la esencia del concepto de certificados digitales, es la práctica o sistema de emisión, validación y revocación de un certificado.
CA (Certificate Authority ) valida la autenticidad de un certificado, es decir, que da el visto bueno, de que un certificado utilizado por un sitio web ES LEGITIMO, o sea que no está siendo impersonado, o duplicado por algun atacante (ver ataque de hombre en el medio MITM ) .
En esta situación se puede usar un CA interno o uno público , la diferencia es que los certificados de los (Root ó Intermediarios) CA públicos, ya están incluidos en el almacén de llaves de un sistema operativo, los certificados de nuestros CA internos, debemos instalarlos manuamente (inciso 6).
En esta situación se puede usar un CA interno o uno público , la diferencia es que los certificados de los (Root ó Intermediarios) CA públicos, ya están incluidos en el almacén de llaves de un sistema operativo, los certificados de nuestros CA internos, debemos instalarlos manuamente (inciso 6).
En SSL/TLS se utiliza un par de llaves, un metodo al que se le llama public key cryptograpy, usado para autenticar y mantener conexiones seguras. Estas se crean al mismo tiempo usando algun mecanismo de encriptacion y se usarn en el proceso del handshake TLS.
Private Key ó Llave Privada
Es un archivo de texto usado inicialmente para crear un CSR , y luego para asegurar y verificar conexiones formadas con el certificado creado.
La llave privada debe estar segura y guardada, ya que si alguien obtiene acceso a ella, puede usar el certificado para fines maliciosos.
Public Key ó Llave Publica
Va incluida en el CSR que se envia al CA, y en el CRT que se recibe a cambio y se coloca en el sitio web. Es la parte del par de llaves que al juntarse con la privada (solo disponible para el servidor) hace un calculo matematico para validar su autenticidad.
CSR (Certificate Signing Request ó Solicitud de Firma de Certificado)
Es un archivo generado en el servidor donde se pondrá el SSL, el mismo donde se produjo la llave privada, y contiene la información que el CA usará para crear el certificado (e.g cn=nombre host/dominio/comun, o=organizacion, c=pais, etc).
Es un archivo generado en el servidor donde se pondrá el SSL, el mismo donde se produjo la llave privada, y contiene la información que el CA usará para crear el certificado (e.g cn=nombre host/dominio/comun, o=organizacion, c=pais, etc).
CRT/CER (Certificate file ó archivo de certificado)
Es el resultado final de haber creado el par de llaves, enviado el CSR al CA para firmado digital, y es el archivo (.crt o .cer) que se instalará en el servidor, para que los usuarios puedan verlo y usarlo para crear una sesión segura.
OpenSSL
Es OpenSSL es un software, bueno, un conjunto de librerias open source cuyo fin y uso es asegurar la comunicación entre las redes de computadoras.
Relativo al tema actual, es ysado ampliamente para implementacion de protocolos SSL/TLS .
4. Configuración de módulos Apache2
Antes de comenzar a generar y aplicar certificados, es necesario tener los modulos listos y habilitados para cargarlos, y tambien el archivo *Nuevo* de configuración para poder servir https y forzar el redireccionamiento desde http.
4.1 Módulos Ubuntu (apache2: rewrite y ssl)
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl restart apache2
4.2 Módulos CentOS (httpd: mod_ssl )
yum install mod_ssl
Se crea un archivo de configuración para el sitio web (la ubicacion cambia segun distribución):
**Nota: los parametros en violeta, son personalizables de acuerdo al gusto o necesidad. Y los comentarios van #
Ubuntu, editar archivo de configuracion:
sudo nano /etc/apache2/sites-available/miweb.conf
y luego de modificarlo habilitar el sitio web.
sudo a2ensite miweb
CentOS, editar archivo de configuracion
sudo nano /etc/httpd/conf.d/miweb.conf
El archivo miweb.conf con el siguiente contenido:
# Contenedor para el sitio web, con el bind al socket de la ip+tcp/443 (https)
<VirtualHost 192.168.116.4:443>
#Las siguientes 3 lineas son para habilitar el ssl, y apuntara la ubicacion de el certificado y su llave privada.
SSLEngine On
SSLCertificateFile "/etc/apache2/ssl/miweb-san.crt"
SSLCertificateKeyFile "/etc/apache2/ssl/miwebrsa.key"
#Opciones básicas de un sitio web (est
DocumentRoot "/var/www/html/miweb"
Options Indexes FollowSymlinks
# El nombre del nuestro host, segun su entrada en el DNS
ServerName web1.plecaetc.local
# IMPORTANTE, este es el que ira en el certificado
</VirtualHost>
# Contenedor para el sitio web, con el bind al socket de la ip+tcp/80 (http)
<VirtualHost 192.168.116.4:80>
#La primera linea, nombre de host que espera (pero en puerto http)
ServerName web1.plecaetc.local
#La directiva que hace el redireccionamiento
Redirect / https://web1.plecaetc.local
</VirtualHost>
4.4 Metodo Alterno Redirect Ubuntu y CentOS (Obsoleto)
nano /var/www/html/miweb/.htaccess
RewriteEngine On
RewriteCond %{HTTP_HOST} ^web1\.plecaetec\.local [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://web1.plecaetec.local/$1 [R,L]
5. Crear Private Key y CSR
El escenario ya ha sido preparado para el webserver, los modulos y configuración, todo está en orden, por lo que se comienza la parte que corresponde a la generación del Certificado y lo que lo rodea..
5.1 Generar llave
OpenSSL tiene la fortuna de ser standard en ambas familias de distribución, por lo que los pasos aplican a ambos.
Se utilizará para crear la llave privada, ya que contiene muchas librerias para hashing, encriptación de files (sym/asym) , y para lo que nosotros usaremos, algoritmo de firma digital para certificados.
Volvernos al directorio de apache
Ubuntu: /etc/apache2/
CentOS: /etc/httpd/
cd/etc/apache2/
sudo mkdir ssl
cd ssl
5.1.1 Usando algoritmo RSA
Es usado normalmente para redes de computadoras, y por los equipos legacy, el requerimiento minimo de bits usados para generar la llave, es 2048 bit en los tiempos modernos.
sudo openssl genrsa -out /etc/apache2/ssl/miwebrsa.key 2048
5.1.2 Usando algoritmo ECDSA
Para mobiles, se puede utilizar ECDSA , que es más liviano para transportar, como ejemplo 112 bit brindan la misma seguridad que 2048 en RSA.
Es bueno ver las alternativas de curvas posibles para utilizar
sudo openssl ecparam -list_curves
En el listado de posibles , se eligio el de 112bit para genrear la llave.
sudo openssl ecparam -name secp112r1 -genkey -noout -out /etc/apache2/ssl/miwebecdsa.key
OpenSSL también brinda las librerias para poder crear solicitud de firma de certificados, CSR, para enviarlos a la Autoridad Certificadora ,CA.
Cualquiera de las llaves creadas en el paso 5.1 puede ser usado.
5.2.1 Metodo no SAN (Obsoleto, usar metodo 5.2.2)
sudo openssl req -new -key /etc/apache2/ssl/miweb.key -out /etc/apache2/ssl/miwebrsa.csr
Habrá un prompt de ciertos datos que van en el Subject del certificado (la información general)
**NOTA: Importante es el CommonName (cn) , ya que es el valor que se compara con la URL del navegador, por eso la entrada en el DNS del web server, debe estar bien configurada, en este caso uso web1.plecaetc.local.
5.2.1 Metodo SAN (x509 v3 )
Por los actuales estandares de seguridad, se deben llevar a cabo certificados con Subject Alternative Name, obligatoriamente, por lo que se recomienda utilizar el siguiente comando en donde se utiliza el archivo de configuracion (depende la version de linux), Y SE LE AGREGA el apartado SAN con sus valores, para enviarlos con el CSR al CA (visto a continuación)
openssl req -new -sha256 -key miwebrsa.key -subj "/C=HN/ST=Cortes/O=PlecaEtece Blog/CN=web1.plecaetc.local" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:web1.plecaetc.local,DNS:web2.plecaetc.local")) -out miweb-san.csr
6. Root CA y firmar (crear) certificados
Como se explica anteriormente, el funcionamiento de la infraestructura PKI (inciso 3) se requiere de una autoridad que firme y certifique la legitimidad del certificado que son aplicados.
6.1 Usando CA Interno
6.1.1 Crear una entidad certificadora interna
Es posible crear un root CA en un servidor Linux (Otro, no el que genera el CSR), con OpenSSL , ejecutando los siguientes pasos.
**Nota: Todos los valores son de acuerdo al escenario actual.
Se crea la llave
sudo openssl genrsa -out ca.plecaetc.key 2048
En una sola linea se crea el certificado de CA (parecido a la creacion del CSR)
sudo openssl req -new -x509 -days 1000 -key ca.plecaetc.key -subj "/C=HN/ST=Cortes/O=PlecaEtece Blog/CN=ca.plecaetc.local" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:ca.plecaetc.local,DNS:dns.plecaetc.local")) -out ca-plecaetc.crt
Ubuntu
/etc/ssl/openssl.cnf
CentOS
/etc/pki/tls/openssl.cnf
Buscar y descomentar la siguiente linea.
copy_extensions = copy
Y ejecutar los siguientes comandos:
sudo mkdir /etc/pki/CA/newcerts
sudo touch /etc/pki/CA/serial
sudo echo 1000 > /etc/pki/CA/serial
Si se desea crear duplicas de certificados:
sudo echo unique_subject = no >> /etc/pki/CA/index.txt.attr
6.1.2 Firmar (crear) Certificado con CA interno
El archivo CSR que fue creado en el inciso 5.2 debe ser copiado/subido al servidor que contiene el root CA interno (la ubicación puede ser a gusto personal)
Y ejecutar la siguiente linea de comando dónde:
Todo en una sola línea, o separado en lineas con contrapleca
sudo openssl ca -cert /etc/pki/CA/ca.plecaetc.crt -keyfile /etc/pki/CA/ca.plecaetc.key -in miweb-san.csr -out miweb-san.csr
Queda algo asi:
6.1.3 Agregar / Habilitar CA Interno en almacen de certificados.
Al ser un CA interno, el certificado raiz debe ingresarse en el almacen de certificados Root de confianza de TODOS LOS EQUIPOS que vayan a crear una conexión segura SSL.
6.1.3.a En Linux
Correr los siguientes comandos para copiar el certificado en formato PEM a las rutas necesarias (según distribución)
**Nota=Las rutas de Origen son relativas a donde se han guardado los certificados.
Ubuntu
sudo cp /etc/apache2/ssl/ca.plecaetc.crt /usr/share/ca-certificates/
sudo update-ca-certificates
CentOS
sudo cp /etc/pki/CA/ca.plecaetc.crt /etc/pki/ca-trust/source/anchors/plecaetc-local-CA.pem
sudo update-ca-trust
6.1.3.b En Windows
6.1.4 Visualización de Certificado
6.1.4.a En Linux
sudo openssl x509 -text -noout -in miweb-cert.crt
6.1.4.b En Windows
6.2 Método CA Publico
(Let's Encrypt, via ZeroSSL )
La ventaja principal de este metodo es
Si se dispone de un dominio público, en el que se pueda validar sea de nuestra propiedad, es posible utilizar nuestro CSR con Let's Encrypt , usando como medio ZeroSSL.
Esto está fuera del alcance de este post, pero a continuación una muestra rápida de cómo se hace.
Crear una cuenta en.
Y basta seguir los pasos, hay mucha documentacion disponible en linea al respecto. Y una vez ya generado el certificado, ejecutar el paso del inciso 4.3 Archivo de Configuración...
7. Probar Certificado
Basta con probar conectarse desde un navegador nuevo (Chrome se usa en esta prueba)
Probando con la siguiente url (relativa a este post) http://web1.plecaetc.local
Y debería redireccionar al sitio https con el certificado SAN firmado por la entidad certificadora que hicimos.
No hay comentarios:
Publicar un comentario