• Sin categorizar

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

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

AWS ofrece una solución muy conveniente llamada AWS Certificate Manager (ACM). Proporciona certificados SSL públicos gratuitos que puedes conectar a tus instancias de Elastic Beanstalk (EB) balanceadas por carga.

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

Después de todo, una sola instancia low-cost será suficiente. Simplemente generaremos un certificado usando ACM y lo usaremos en nuestra “instancia única”… espera, ¿qué es eso? ¿no podemos? 😧😧😧

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

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

1. Elastic Beanstalk

El primer paso es despedirte de tu balanceador de carga. Convierte tu tipo de instancia a instancia única en lugar de balanceada por carga. Puedes hacer esto desde la pestaña Capacidad dentro de Configuraciones. Simplemente elige instancia única en el tipo de entorno y listo.

El segundo paso es crear y firmar el certificado usando Certbot. Puedes encontrarlo aquí. Debo mencionar que necesitarás un dominio para usar el certificado.

Abre la terminal en tu máquina local, yo estoy usando mac, así que algunos de los comandos podrían ser un poco diferentes para ti.

certbot certonly --manual -d domain.com --preferred-challenges dns

  • “certonly”: usar autenticadores de certbot.
  • “manual”: generar certificados en máquinas que no sean servidores web.
  • “d”: especificar un dominio.
  • “preferred-challenges”: un método para la verificación de dominio.

El CLI 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 implementes un registro DNS TXT con el nombre _acme-challenge.domain.com. Presiona enter cuando quieras verificar el nuevo registro.

Al crear con éxito el certificado, el CLI 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.

2. .ebextensions

Bien, estamos casi listos. El tercer y último paso es habilitar HTTPS para tu instancia única permitiendo el tráfico en el puerto 443.

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

  • La clave “packages” instala mod24_ssl en la instancia.
  • La clave “files” se utiliza para crear archivos que contengan el certificado, la cadena de certificados y la clave privada que creó certbot.

Nota:

Copia el contenido de “privkey.pem” al archivo server.key

  1. Copia el contenido de fullchain.pem al archivo chain.pem.
  2. Habrá dos claves en fullchain.pem. Solo necesitas copiar la primera clave al archivo server.crt.
  3. 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 el CLI de Certbot.

¡Y voilà! Calificación A+ para tu propio certificado SSL gratuito. Puedes probar tu certificado SSL en ssllabs.com.