Configuracion de un sitio HTTPS en webfaction con let’s encrypt

Estas son mis notas de configuracion de HTTPS en webfaction, pero usando cretificados de Let’s Encrypt.

Hasta el dia de hoy (5 de Octubre de 2017) sólo he probado dos métodos:

En este post voy a probar los dos metodos en el mismo sitio: demos.noenieto.com. Este dominio ya esta configurado en mi webfaction de antemano:

Sitio HTTPS ya configurado en webfaction

Como ultimo detalle, la ruta hacia el directorio del sitio es: ~/webapps/demos_noenieto y el sitio esta configurado para http y https ya que es necesario acceso al sitio por HTTP antes de poder emitir el certificado por primera vez.

Probando Acme.sh

Este fue la primera herramiente que use, hace unos 6 meses. Para instalar Acme.sh me basé en una respuesta a una pregunta en el foro de webfaction.

El proceso de instalación es bastante sencillo por que acme.sh viene con su propio instalador.

curl https://get.acme.sh | sh

Al correr el instalador saca algunos mensajes de error:

It is recommended to install socat first. We use socat for standalone server if you use standalone mode. If you don't use standalone mode, just ignore this warning

Simplemente ignore el mensaje y segui con la tarea. Entonces, acme.sh ya esta instalado. Para acceder a la ayuda de acme.sh se debe de usar la opción --help:

acme.sh --help

Las opciones son muchas, pero solo haremos uso de unas cuantas a la vez. Lo primero que quiero hacer es emitir el certificado para un sitio por primera vez; como es la primera vez que voy a hacer esto usaré la opción --test de acme.sh

acme.sh --issue --test -d demos.noenieto.com -w ~/webapps/demos_noenieto
acme.sh --issue --test -d demos.noenieto.com -w ~/webapps/demos_noenieto
acme.sh --issue -d demos.noenieto.com -w ~/webapps/demos_noenieto
acme.sh --force --issue -d demos.noenieto.com -w ~/webapps/demos_noenieto
ls /home/fulano/.acme.sh/demos.noenieto.com/
demos.noenieto.com.cer
demos.noenieto.com.key
ca.cer

Renovacion y cronjob

acme.sh --cron --home /home/fulano/.acme.sh
/home/fulano/.acme.sh/acme.sh --cron --home /home/fulano/.acme.sh
acme.sh --renew-all
acme.sh --renew-all --force
/home/fulano/.acme.sh/acme.sh --cron --home /home/fulano/.acme.sh
/home/fulano/.acme.sh/acme.sh --cron --force --home /home/fulano/.acme.sh

acme.sh –list | tail -n +2 | cut -f 1 -d ‘ ‘

52 0 * * * /home/fulano/.acme.sh/acme.sh --cron --home /home/fulano/.acme.sh > /dev/null
#!/usr/bin/env python
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
from os.path import join as joinpath, expanduser
from xmlrpclib import ServerProxy


wf_api = ServerProxy('https://api.webfaction.com/')
session_id, account = wf_api.login(
    'fulano',
    'sup3rs4dr37',
    '',
    2
)

base_path = '~/.acme.sh'
domains = ['demos.noenieto.com', ]

for domain in domains:
    dpath = joinpath(base_path, domain)
    cert_path = joinpath(dpath, '{}.cer'.format(domain))
    privkey_path = joinpath(dpath, '{}.key'.format(domain))
    intermediates_path = joinpath(dpath, 'fullchain.cer')
    wf_api.update_certificate(
        session_id,
        open(expanduser(cert_path), 'r').read(),
        open(expanduser(privkey_path), 'r').read(),
        open(expanduser(intermediates_path), 'r').read()
    )

Probando letsencrypt_webfaction

Docus chida::

http://bcc.npdoty.name/directions-to-migrate-your-WebFaction-site-to-HTTPS

Instalacion

GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.2 install letsencrypt_webfaction

Agregar esto al final de .bash_profile vim .bash_profile

function letsencrypt_webfaction {
    PATH=$PATH:$GEM_HOME/bin GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib ruby2.2 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction $*
}

export -f letsencrypt_webfaction

Para no reiniciar reiniciar sesion:

source ~/.bash_profile

letsencrypt_webfaction

letsencrypt_webfaction –help

Configuracion

La herramienta tiene muchos ajustes, asi que es mejor guardar todo en un archivo.

mkdir -p ~/SSL/www.misitio.org/
vim ~/SSL/www.misitio.org/config.yml

Aca esta el contenido de mi archivo.

domains: [www.noenieto.com, noenieto.com]
public: [/home/fulano/webapps/misitio]
output_dir: /home/fulano/SSL_certificates/demos.noenieto.com
letsencrypt_account_email: nnieto@noenieto.com
username: fulano
password: S00p3rp455
cert_name: myapp_ssl_cert

Primero probamos con staging

$ letsencrypt_webfaction --endpoint https://acme-staging.api.letsencrypt.org/ --config=$HOME/SSL_certificates/www.holokineticpsychology.org/config.yml 
Your new certificate is now created and installed.
You will need to change your application to use the ichp_ssl_cert certificate.
Add the `--quiet` parameter in your cron task to remove this message.

Nota: Tuve que configurar el DNS en IPv4 e IPv6 con registros A y AAAA. Tuve muchos problemas por que el registro era un CNAME a el servidor de webfaction. Despues de la ayuda del creador de letsencrypt_webfaction decidi probar a configurar todo con reegustros A y AAAA.

El comando final es este:

letsencrypt_webfaction –config=$HOME/SSL_certificates/demos.noenieto.com/config.yml

Despues de esto verifico que myapp_ssl_cert ya aparece en la lista de certificados de webfaction. Es solo cuestion de seleccionar el certificado para el sitio https adecuado.

Renovacion y cronjob

Primero voy a hacer un script de bash para simplificar

#!/bin/bash
PATH=$PATH:$GEM_HOME/bin:/usr/local/bin
GEM_HOME=$HOME/.letsencrypt_webfaction/gems
RUBYLIB=$GEM_HOME/lib

ruby2.2 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction \
    --config=$HOME/SSL_certificates/demos.noenieto.com/config.yml \
    --domains [yourdomain.com,www.yourdomain.com] --public ~/webapps/[yourapp/your_public_html]/ \
    --quiet

Luegoi el Cron

Pero falta leer la documentacion.