Instalando apache con certificado SSL activo, automatizando con Ansible o Comando bash
En este artículo, explicaremos cómo utilizar Ansible para instalar Apache, generar un certificado SSL autofirmado y configurar Apache para usar este certificado. Además, proporcionaremos una nota adicional sobre cómo usar Certbot para obtener un certificado SSL firmado por una autoridad de certificación (CA) de confianza. al final del articulo encontraras los comandos de linux basado, considerando una instalación en una distro de red hat (Centos, Rocky linux, Alma Linux, etc), aunque la configuracion es muy parecida para las distros basadas en debian.
Instalación de Apache y activación de SSL con un certificado autofirmado
Primero, vamos a definir el playbook de Ansible que haremos para instalar Apache y configurarlo para usar SSL. Asegúrate de reemplazar your_host con el nombre de host de tu servidor y server.ebolges.com con el nombre del dominio para el que estás generando el certificado.
Guarda este playbook en un archivo por ejemplo instalar-apache-ssl.yml
--- - hosts: your_host become: yes vars: NOMBRESERVIDOR: server.ebolges.com tasks: - name: Ensure httpd is installed package: name: httpd state: present - name: Ensure mod_ssl is installed package: name: mod_ssl state: present - name: Generate an OpenSSL private key. openssl_privatekey: path: /etc/ssl/certs/privkey.pem - name: Generate an OpenSSL CSR. openssl_csr: path: /etc/ssl/certs/fullchain.pem privatekey_path: /etc/ssl/certs/privkey.pem common_name: "{{ NOMBRESERVIDOR }}" - name: Generate DH Parameters with a different size (2048 bits) openssl_dhparam: path: /etc/ssl/certs/dhparams.pem size: 2048 - name: Generate a Self Signed OpenSSL certificate. community.crypto.x509_certificate: path: /etc/ssl/certs/CertificadoAutofirmado.crt privatekey_path: /etc/ssl/certs/privkey.pem csr_path: /etc/ssl/certs/fullchain.pem provider: selfsigned selfsigned_not_after: 20241221162800Z - name: Update SSLCertificateFile directive in Apache configuration ansible.builtin.lineinfile: path: /etc/httpd/conf.d/ssl.conf regexp: '^SSLCertificateFile.*$' line: 'SSLCertificateFile /etc/ssl/certs/CertificadoAutofirmado.crt' - name: Update SSLCertificateKeyFile directive in Apache configuration ansible.builtin.lineinfile: path: /etc/httpd/conf.d/ssl.conf regexp: '^SSLCertificateKeyFile.*$' line: 'SSLCertificateKeyFile /etc/ssl/certs/privkey.pem' ...
Este playbook realiza las siguientes acciones:
- Asegura que Apache (httpd) y mod_ssl están instalados.
- Genera una clave privada de OpenSSL.
- Genera una solicitud de firma de certificado (CSR) de OpenSSL.
- Genera parámetros DH.
- Genera un certificado autofirmado de OpenSSL.
- Actualiza la configuración de Apache para usar el certificado y la clave privada generados.
Para ejecutarlo simplemente debes ejecutar el comando mas abajo y asumiendo que tiene el archivo inventario correctamente configurado
ansible-playbook instalar-apache-ssl.yml
Nota adicional: Cómo utilizar Certbot para obtener un certificado SSL de una CA de confianza
Para aquellos que deseen un certificado firmado por una autoridad de certificación de confianza, Certbot es una excelente opción. Aquí hay un ejemplo de cómo configurar Certbot con Ansible:
- name: Install epel-release yum: name: epel-release state: latest - name: Install certbot yum: name: certbot state: latest - name: Obtain a certificate using the webroot plugin command: > certbot certonly --webroot -w /var/www/html -d {{ NOMBRESERVIDOR }} --agree-tos --email admin@{{ NOMBRESERVIDOR }} --non-interactive notify: Restart Apache
Asegúrate de que la ruta webroot y la dirección de correo electrónico sean correctas para tu configuración. Una vez que hayas obtenido el certificado, tendrás que modificar la configuración de Apache (como se mostró anteriormente) para usar el certificado y la clave privada generados por Certbot. Por defecto, estos se encontrarán en
/etc/letsencrypt/live/{{ NOMBRESERVIDOR }}/fullchain.pem
/etc/letsencrypt/live/{{ NOMBRESERVIDOR }}/privkey.pem
Aplicando el certificado de Certbot a la configuración de apache
Por supuesto, para utilizar los certificados generados por Certbot, tendrás que apuntar la configuración de Apache hacia las ubicaciones de los archivos de certificado y clave privada proporcionados por Certbot. Esto se puede hacer con tareas de Ansible similares a las que utilizamos para el certificado autofirmado, pero con diferentes ubicaciones de archivos. Aquí está cómo se vería:
- name: Update SSLCertificateFile directive in Apache configuration for Certbot ansible.builtin.lineinfile: path: /etc/httpd/conf.d/ssl.conf regexp: '^SSLCertificateFile.*$' line: 'SSLCertificateFile /etc/letsencrypt/live/{{ NOMBRESERVIDOR }}/fullchain.pem' - name: Update SSLCertificateKeyFile directive in Apache configuration for Certbot ansible.builtin.lineinfile: path: /etc/httpd/conf.d/ssl.conf regexp: '^SSLCertificateKeyFile.*$' line: 'SSLCertificateKeyFile /etc/letsencrypt/live/{{ NOMBRESERVIDOR }}/privkey.pem'
En este caso, con las tareas anteriores, reemplazamos las rutas del certificado y la clave privada con las rutas proporcionadas por Certbot. Las tareas buscarán la directiva que comienza con 'SSLCertificateFile' y 'SSLCertificateKeyFile' respectivamente en el archivo de configuración de Apache, y reemplazarán toda la línea con la nueva ruta del certificado o clave privada.
Por supuesto, asegúrate de que {{ NOMBRESERVIDOR }} esté configurado con el nombre de dominio correcto para el que se generó el certificado.
Los comandos equivalentes en Bash para las tareas de Ansible anteriores (En caso que que lo quieras hacer SIN ANSIBLE) serían los siguientes:
Certificado Autofirmado
- Primero, instalar mod_ssl:
sudo yum install -y mod_ssl
- Luego, generar el certificado autofirmado:
openssl genpkey -algorithm RSA -out /etc/ssl/certs/privkey.pem openssl req -new -key /etc/ssl/certs/privkey.pem -out /etc/ssl/certs/fullchain.pem -subj "/CN=your_server_name" openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048 openssl req -x509 -key /etc/ssl/certs/privkey.pem -in /etc/ssl/certs/fullchain.pem -out /etc/ssl/certs/CertificadoAutofirmado.csr -days 365
Asegúrate de reemplazar your_server_name con el nombre de dominio correcto.
- Actualiza la configuración de Apache para usar el certificado y la clave privada autofirmados:
sudo sed -i 's|^SSLCertificateFile.*$|SSLCertificateFile /etc/ssl/certs/CertificadoAutofirmado.csr|' /etc/httpd/conf.d/ssl.conf sudo sed -i 's|^SSLCertificateKeyFile.*$|SSLCertificateKeyFile /etc/ssl/certs/privkey.pem|' /etc/httpd/conf.d/ssl.conf
Para usar Certbot,
- Primero instalarlo:
sudo yum install -y epel-release --enablerepo=crb sudo yum install -y certbot --enablerepo=crb,epel
- Obtén un certificado SSL con Certbot:
sudo certbot certonly --webroot -w /var/www/html -d your_server_name --agree-tos --email admin@your_server_name --non-interactive
- Y finalmente, actualiza la configuración de Apache para usar el certificado y la clave privada proporcionados por Certbot:
sudo sed -i 's|^SSLCertificateFile.*$|SSLCertificateFile /etc/letsencrypt/live/your_server_name/fullchain.pem|' /etc/httpd/conf.d/ssl.conf sudo sed -i 's|^SSLCertificateKeyFile.*$|SSLCertificateKeyFile /etc/letsencrypt/live/your_server_name/privkey.pem|' /etc/httpd/conf.d/ssl.conf
Una vez más, asegúrate de reemplazar your_server_name con el nombre de dominio correcto.