Como instalar y activar el ssl en apache con Ansible y cerbot o certificado auto firmado

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:

  1. Asegura que Apache (httpd) y mod_ssl están instalados.
  2. Genera una clave privada de OpenSSL.
  3. Genera una solicitud de firma de certificado (CSR) de OpenSSL.
  4. Genera parámetros DH.
  5. Genera un certificado autofirmado de OpenSSL.
  6. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *