• Sin categorizar

Configurar un Certificado SSL — AWS Elastic Beanstalk (Instancia Única)

SSL asegura la transferencia de datos entre el cliente y el servidor. No solo eso, también aumenta el ranking de tu sitio web en Google, por lo que se puede decir que los certificados SSL son imprescindibles al construir aplicaciones.

AWS proporciona una solución muy conveniente llamada “AWS Certificate Manager” (ACM). No solo eso, también aumenta el ranking de tu sitio web en Google, por lo que se puede decir que los certificados SSL son imprescindibles al construir aplicaciones.

¡¡Eso es genial!! ¡Pero podemos prescindir del balanceador de carga para las instancias que alojan nuestros entornos de desarrollo y proyectos secundarios… ¿¿CIERTO??

Después de todo, una única instancia low-cost será suficiente. Simplemente generaremos un certificado utilizando ACM y lo usaremos en nuestra “single instance”… Espera, ¿¿Qué es eso?? ¿¿No podemos?? 😧😧😧

Aparentemente, ACM requiere un balanceador de carga (o distribución de CloudFront). No es posible utilizar el certificado directamente con una instancia.

Bueno, eso es un poco molesto 😒 pero no te preocupes, aún podemos obtener un certificado SSL gratuito sin incurrir en gastos innecesarios de balanceador de carga, en tres sencillos pasos.

1. Elastic Beanstalk

El primer paso es despedirse de tu balanceador de carga. Convertir tu tipo de insancia a single instance de “load balanced.” Puedes hacer esto desde la pestaña Capacity dentro de Configurations. Simplemente elige “instancia única” en el tipo de entorno y eso es todo.

2. Certbot

El segundo paso es crear y firmar el certificado utilizando “certbot”. Puedes encontrarlo aquí. Debería mencionar que necesitarás un dominio para utilizar el certificado.

Abre la terminal en tu máquina local. Estoy usando Mac, así que algunos de los comandos pueden ser un poco diferentes para ti.

certbot certonly --manual -d domain.com --preferred-challenges dns
  • “certonly”: utiliza autenticadores de cerbot
  • “manual”: genera certificados en máquinas que no sean servidores web.
  • “d”: especifica un dominio
  • “preferred-challenges”: un método para la verificación del dominio

La interfaz de línea de comandos te pedirá que permitas registrar la dirección IP de tu máquina. Tienes que aceptar para continuar.

Después de eso, te pedirá que despliegues un registro DNS TXT con el nombre_acme-challenge.domain.com. Presiona “enter” cuando desees verificar el nuevo registro.

Al crear con éxito el certificado, la interfaz de línea de comandos generará dos archivos: “privkey.pem” y “fullchain.pem”.

certbot certificates

Puedes usar el comando anterior para listar todos los certificados junto con las rutas a sus archivos.

3. .ebextensions

Bien, así que casi hemos terminado, el tercer y último paso es habilitar HTTPS para tu “instancia única” permitiendo el tráfico en el puerto 443.

ChatGPT Crea una carpeta llamada .ebextensions, es importante que el nombre sea exactamente el mismo. Luego crea un archivo de configuración con la extensión “.config”.

Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0
packages:
  yum:
    mod24_ssl : []
files:
  /etc/httpd/conf.d/ssl.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      LoadModule ssl_module modules/mod_ssl.so
      Listen 443
      <VirtualHost *:443>
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>
        SSLEngine             on
        SSLCertificateFile    "/etc/pki/tls/certs/server.crt"
        SSLCertificateChainFile    "/etc/pki/tls/certs/chain.pem"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
        SSLCipherSuite        EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
        SSLProtocol           All -SSLv2 -SSLv3
        SSLHonorCipherOrder   On
        SSLSessionTickets     Off
        Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
        Header always set X-Frame-Options DENY
        Header always set X-Content-Type-Options nosniff
        ProxyPass / http://localhost:80/ retry=0
        ProxyPassReverse / http://localhost:80/
        ProxyPreserveHost on
        RequestHeader set X-Forwarded-Proto "https" early
      </VirtualHost>
  /etc/pki/tls/certs/server.crt:
    mode: "000400"
    owner: root
    group: root
    source: 'https://s3-eu-west-1.amazonaws.com/numu.elasticbean/ssl/`{"Ref": "AWSEBEnvironmentName" }`.crt'
    authentication: S3Access
  /etc/pki/tls/certs/server.key:
    mode: "000400"
    owner: root
    group: root
    source: 'https://s3-eu-west-1.amazonaws.com/numu.elasticbean/ssl/`{"Ref": "AWSEBEnvironmentName" }`.key'
    authentication: S3Access
  /etc/pki/tls/certs/chain.pem:
    mode: "000400"
    owner: root
    group: root
    source: 'https://s3-eu-west-1.amazonaws.com/numu.elasticbean/ssl/`{"Ref": "AWSEBEnvironmentName" }`.pem'
    authentication: S3Access
  • “packages” la clave instala mod24_ssl en la instancia.
  • “files” la clave se utiliza para crear archivos que contienen el certificado, la cadena de certificados y la clave privada que certbot creó.

Nota:

  1. Copia el contenido de “privkey.pem” al archivo server.key
  2. Copia el contenido de “fullchain.pem” al archivo chain.pem
  3. Habrá dos claves en “fullchain.pem” Solo necesitas copiar la primera clave al archivo server.crt

Ahora todo lo que tienes que hacer es desplegar tu código en Elastic Beanstalk. Asegúrate de que tu instancia esté conectada a la misma URL en Route53 que ingresaste en la interfaz de línea de comandos de certbot.

“¡¡¡Voilà!!! Calificación A+ para tu propio certificado SSL sin coste alguno. Puedes testear tu certificado SSL en ssllabs.com.”