logo letsencrypt

Letsencrypt nace de la necesidad de que los usuarios de internet consigan una certificación SSL/TLS de forma sencilla y sobretodo gratuita, con el beneficio de que se crearán conexiones y navegaciones más seguras en internet.

Aquí explico paso a paso como conseguir que validen un certificado para tu web, correo o cualquier otro servicio que necesite SSL/TLS para ser más seguro.

 

 

IMPORTANTE: Todos los comandos y configuraciones se realizan en un servidor Debian Jessie y con la versión de OpenSSL 1.0.1t

Sobre letsencrypt

La entidad certificadora letsencrypt es una inicativa de la Linux Foundation para que los usuarios de internet puedan hacer sus proyectos, webs,... más seguros gracias a la validación de sus certificados sin ningún coste de creación ni de renovación haciendo que los usuarios no tengamos excusa para proteger un poco mas nuestos sitios en internet.

En la web de letsencrypt se explica en ingles cual es su función, entre otras cosas, no está de más hechar un vistazo https://letsencrypt.org/

 

Empezando

Lo primero es descargar el cliente de letsencrypt de github, entraremos en el directorio de la carpeta descargada y ejecutaremos el cliente.

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

Esto instalará los diferentes paquetes que necesita ( python, gcc,...) para poder configurarse correctamente

 

Creando el certificado

Primero de todo hay que saber que dominio y subdominios vamos a proteger con el certificado ya que hay que especificarlo en el siguiente comando.

Este comando generará el par de claves publica y privada junto con el csr. No olvidaros que debeis cambiar los valores de los parámetros por los que vosotros necesiteis.

openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout privkey.pem -out signreq.der -subj "/C=SP/ST=BI/O=NoLucro,S.A./CN=dominio.com" -outform der -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:dominio.com,DNS:www.dominio.com,DNS:subdominio.com,DNS:www.subdominio.com"))

(Comando y explicación de comando original en http://foro.elhacker.net/seguridad/tutorial_certificado_https_iexclgratis-t445507.0.html)

Explicación del comando:

-newkey: Genera un par de claves, en este caso RSA 2048 bit. También soporta 4096 bit.
-sha256: Algoritmo empleado para la verificación de la firma digital del certificado. Recordad, SHA-1 se considerá inseguro.
-nodes: La clave privada no será cifrada mediante criptografía simétrica.
-keyout: Archivo donde se guardará la clave privada, su contenedor es del tipo .pem.
-out: Archivo donde se guardará el CSR, IMPORTANTÍSIMO que sea .der pues LetsEncrypt no soporta .pem para el CSR.
-subj: Información personal del dueño de nuestra Web (nosotros). "C" es Country (país, 2 letras, SP=España), ST (ciudad, ¿2 letras?, BI=Bilbao), O (organicación), CN (dominio de la web).
-outform der: Como ya he dicho, este comando es fundamental para convertir el CSR en formado .der para que sea reconocible por LetsEncrypt.
-reqexts: Nos permite espicificar más de un dominio para el certificado, así un mismo certificado sirve para varios dominios/subdominios.
SAN: Subject Alter Name, campo del CSR donde podemos especificar más de un dominio, como ya he dicho previamente. Importante incluir los dominios sin www y con www, además de incluir el dominio del campo "CN".

 

En el caso de no tener el fichero "/etc/pki/tls/openssl.cnf" nos mostrará el siguiente error

unable to find 'distinguished_name' in config
problems making Certificate Request

Solucionaremos el error creando un fichero de configuración para nuestro certificado. Usaremos la siguiente plantilla para crear la configuración.

[ req ] 
default_bits = 1024 # Size of keys 
default_keyfile = key.pem # name of generated keys 
default_md = md5 # message digest algorithm 
string_mask = nombstr # permitted characters 
distinguished_name = req_distinguished_name 

[ req_distinguished_name ] 
# Variable name   Prompt string 
#----------------------   ---------------------------------- 
0.organizationName = Organization Name (company) 
organizationalUnitName = Organizational Unit Name (department, division) 
emailAddress = Email Address 
emailAddress_max = 40 
localityName = Locality Name (city, district) 
stateOrProvinceName = State or Province Name (full name) 
countryName = Country Name (2 letter code) 
countryName_min = 2 
countryName_max = 2 
commonName = Common Name (hostname, IP, or your name) 
commonName_max = 64 

# Default values for the above, for consistency and less typing. 
# Variable name   Value 
#------------------------------   ------------------------------ 
0.organizationName_default = The Sample Company 
localityName_default = Metropolis 
stateOrProvinceName_default = New York 
countryName_default = US 

[ v3_ca ] 
basicConstraints = CA:TRUE 
subjectKeyIdentifier = hash 
authorityKeyIdentifier = keyid:always,issuer:always 

Lo guardaremos como openssl.cnf donde nosotros queramos y especificaremos la ruta en el comando openssl:

openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout privkey.pem -out signreq.der -subj "/C=SP/ST=BI/O=NoLucro,S.A./CN=dominio.com" -outform der -reqexts SAN -config <(cat openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:dominio.com,DNS:www.dominio.com,DNS:subdominio.com,DNS:www.subdominio.com"))

Si todo ha ido bien nos mostrará lo siguiente:

Generating a 2048 bit RSA private key
................................+++
..............................+++
writing new private key to 'privkey.pem'
-----

Y nos habrá creado los archivos privkey.pem y signreq.der. Este último formato es necesario para letsencrypt ya que solo soporta el formato .der

 

Validando el certificado

Una vez tenemos el certificado creado pasamos a que nos lo valide la entidad, usaremos el siquiente comando modificando los datos por los nuestros:

 ./letsencrypt-auto certonly --authenticator manual --email Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. --csr signreq.der --text --debug

A partir de aquí os irá preguntando y vais respondiendo según penseis. Será algo parecido a esto:

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

 A partir de aquí tenemos que verificar que nosotros somos los dueños de los dominios. Tendremos que poner en nuestras webs los archivos que nos diga con el contenido que nos diga, validando uno por uno cada dominio y subdominio. Saldrá algo parecido a esto:

Make sure your web server displays the following content at
http://imap.m-hunter.com/.well-known/acme-challenge/K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g before continuing:

K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g.9qFzAPealxHFRAHS31rFQJUFeaHEThm6MtpNbhI4EOg

If you don't have HTTP server configured, you can run the following
command on the target server (as root):

mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g.9qFzAPealxHFRAHS31rFQJUFeaHEThm6MtpNbhI4EOg > .well-known/acme-challenge/K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()" 
Press ENTER to continue

Comprobaremos que tenemos el archivo creado y le daremos a enter.

Si todo ha ido bien nos hará volver a pedir que aceptemos que nuestra ip se quedará registrada en sus servidores y seguiremos con el siguiente dominio/subdominio.

En el caso de que algo fallara nos mostraría el siguiente mensage por consola en color rojo.

2016-06-06 06:22:22,518:WARNING:certbot.plugins.manual:Self-verify of challenge failed. 

Si ocurre esto tenemos que revisar que se esté viendo correctamente el contenido del archivo.

En nginx, en mi caso, he configurado una regla para poder mostrar el fichero sin extensión html. Os paso la configuración.

location / {
      try_files $uri $uri.html $uri/ @extensionless-html;
      index index.html index.htm index.php;
}

location @extensionless-html {
      rewrite ^(.*)$ $1.html last;
}

Con esto y nombrando el fichero que necesiteis a .html mostrará el contenido del archivo sin descargarlo. El ejemplo del comando seria este:

 echo "K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g.9qFzAPealxHFRAHS31rFQJUFeaHEThm6MtpNbhI4EOg" > .well-known/acme-challenge/K3zTc2nq-LCVogFJ9l9CnYNF0W7SK9GZtGhF_seM38g.html

 Después de validar todos los dominios y subdominios, si todo ha ido bien, nos devolverá lo siguiente:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /root/letsencrypt/0001_chain.pem. Your cert will expire on
   2016-09-04. To obtain a new or tweaked version of this certificate
   in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 Y con esto ya tendremos nuestro certificado validado en la ruta que nos ponga la salida, en mi caso /root/letsencrypt/0001_chain.pem.

 

Webgrafia: http://foro.elhacker.net/seguridad/tutorial_certificado_https_iexclgratis-t445507.0.html

 

 

  • No se han encontrado comentarios

Deja tus comentarios

Enviar un comentario como invitado

0 / 300 Restricción de Carateres
El texto debe estar entre 2-300 caracteres
Sus comentarios están sujetos a moderación por un administrador.