Error de Let’s Encrypt Certbot en Amazon EC2

"ImportError: No module named cryptography".


Imagino que llegaste a mi sitio web, porque administras una instancia Amazon EC2 e intentaste crear, extender y/o renovar un certificado SSL gratuito, a través del servicio de Let’s Encrypt, con el comando “certbot-auto” y obtuviste el escalofriante error relacionado con el módulo “cryptography”. Yo también lo he sufrido frecuentemente con este error, hasta que encontré la solución que explicaré aquí.

Observación: Yo trabajo con Apache como servidor web.

Asumiré que tienes los conocimientos básicos sobre el servicio de Let’s Encrypt y como sabes, este servicio está marcado en modo experimental para la versión Amazon Linux 2, conocida como AMI (Amazon Machine Image), versión que ha sido modificada para optimizar el rendimiento en una instancia EC2 y su integración con el entorno de servicios AWS (Amazon Web Service).

En enero de 2018, uno de los ingenieros que trabaja en el proyecto Certbot, explicaba que no han logrado que este software sea confiable en Amazon Linux, porque esta distribución es un poco diferente a las demás y no han encontrado apoyo desde el lado de Amazon para lograrlo. ¿Por qué? No lo sé. Tal vez Amazon prefiere que usemos su servicio de certificados SSL que sólo se pueden implementar en su ELB (Elastic Load Balancing).

Fuente:
Comunidad Let's Encrypt

Detalle del error:

  Error: couldn't get currently installed version for /opt/eff.org/certbot/venv/bin/letsencrypt: 
  Traceback (most recent call last):
    File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 7, in <module>
      from certbot.main import main
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/certbot/main.py", line 10, in <module>
      import josepy as jose
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/__init__.py", line 44, in <module>
      from josepy.interfaces import JSONDeSerializable
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/interfaces.py", line 8, in <module>
      from josepy import errors, util
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/josepy/util.py", line 4, in <module>
      import OpenSSL
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/__init__.py", line 8, in <module>
      from OpenSSL import crypto, SSL
    File "/opt/eff.org/certbot/venv/local/lib/python2.7/dist-packages/OpenSSL/crypto.py", line 12, in <module>
      from cryptography import x509
  ImportError: No module named cryptography

  

Algunas de las versiones de las AMI con las que ocurre el error:

  • Amazon Linux AMI release 2017.03
  • Amazon Linux AMI release 2017.09
  • Amazon Linux AMI release 2018.03

La solución que se plantea ha sido probada en estas versiones de AMI. Si tienes una versión diferente, te pido que me comentes, a través alguna de mis redes sociales, si también funcionó en tu caso.

Para conocer tu versión de AMI:

      $ cat /etc/system-release
    

Solución

La mejor solución que he encontrado, consiste en remover el directorio certbot-auto que descargaste en un inicio e instalar Certbot para la versión 3.6 de python.

Primero, debes remover todo lo que se relacione con los antiguos paquetes:

      $ sudo rm -rf /opt/eff.org/*
    

Segundo, instala Python 3.6:

      $ sudo yum -y install python36 python36-pip python36-libs python36-tools python36-virtualenv
    

Tercero, instala Cerbot para Python 3.6:

      $ sudo /usr/bin/pip-3.6 install -U certbot
    

Y finalmente, instala el paquete para Apache:

      $ sudo /usr/bin/pip-3.6 install certbot-apache
    

A partir de este momento, no deberás crear, extender o renovar los certificados con el comando cerbot-auto, sino con la ruta absoluta, por ejemplo:

      $ sudo /usr/local/bin/certbot --debug -v --server https://acme-v01.api.letsencrypt.org/directory certonly -d midominio.com -d www.midominio.com