HomePage

Aggiungi certificato SSL gratuito alla tua applicazione web

Hai costruito il tuo bellissimo sito con Phoenix Framework, Ok qual è prossimo passo? come faccio lanciarlo sul server?

In questa piccola guida cercherò a rispondere a queste due domande. Ne ho letto moltissime guide online e in tutte ne mancava qualche passo o erano fin troppo dettagliati e difficili da seguire. Quindi un altro dei obbiettivi sarà scrivere una guida semplice e chiara.

Questa guida è fatta per piccoli e medie progetti, per progetti più complessi con grande traffico non consiglio seguire questo metodo!

Prima di partire aggiungiamo nel file di configurazione due righe:

config/prod.exs

config :my_website, MyWebsiteWeb.Endpoint,
  http: [port: 80],
  url: [host: "mywebsite.com"],
  force_ssl: [hsts: true],
  https: [
    port: 443,
    cipher_suite: :strong,
    keyfile: "/etc/letsencrypt/live/www.mywebsite.com/privkey.pem",
    cacertfile: "/etc/letsencrypt/live/www.mywebsite.com/chain.pem",
    certfile: "/etc/letsencrypt/live/www.mywebsite.com/cert.pem"
  ],
  secret_key_base: "*****************************",
  check_origin: false,
  pubsub_server: MyWebsite.PubSub,
  live_view: [signing_salt: "***********"],
  server: true

Compiliamo la nostra web app in una release per costruire un pacchetto da eseguire sul server.

Una nota importante da tenere conto: la release deve essere costruita su stesso sistema e stessa architettura del server. Potete farlo con virtual machine o docker, importante che sia impostato per architetture e sistema operativo del vostro server.

Sconsiglio portare codice sul server per compilarlo!

Lanciamo commando per scaricare le dipendenze:

[el@localhost ~]$ mix deps.get && npm install --prefix assets/

Compiliamo la nostra release:

[el@localhost ~]$ mix phx.digest.clean && mix phx.digest

// file .env contiene tutti variabili dell'ambiente 
[el@localhost ~]$ source .env && MIX_ENV=prod mix release --overwrite

La nostra release viene salvata nella cartella _build/ Creiamo archivio zip e inviamo tutto su server:

[el@localhost ~]$ zip -rq my_website.zip _build/prod/rel/me_website/*
[el@localhost ~]$ scp -C my_website.zip root@101.101.101.101:/home/

Si può anche inviare file .env sul server se non si vuole settare manualmente tutti variabili dell’ambiente.

Script completo:

nano build.sh

mix deps.get && npm install --prefix assets/
mix phx.digest.clean && mix phx.digest
source .env && MIX_ENV=prod mix release --overwrite
zip -rq my_website.zip _build/prod/rel/me_website/*
scp -C my_website.zip root@101.101.101.101:/home/
scp -C .env root@101.101.101.101:/home/

chmod u+x build.sh

Una volta caricato pacchetto sul server faccio unzip del archivio nella cartella /home:

[el@localhost ~]$ ssh root@101.101.101.101
// server
[root@localhost ~]$ cd /home && unzip my_website.zip 

Creiamo certificato SSL gratuito con Let’s Encrypt

Let’s Encrypt è un’autorità di certificazione senza scopo di lucro che ti fornisce il tuo certificato SSL una volta verificato che il dominio è di tua proprietà.

La verifica e creazione del certificato viene fatta attraverso programma Certbot e ti permette anche automatizzare il rinnovo del certificato.

Io uso ArchLinux come OS del server quindi per scaricarlo lo faccio in un solo commando:

[root@localhost ~]$ pacman -S certbot

Dopo di che lancio commando per creazione e verifica del dominio:

certbot certonly --standalone --preferred-challenges http -d www.mywebsite.com -d mywebsite.com

Inserito e-mail e completato processo di verifica dominio, viene generato file di configurazione e chiavi del certificato SSL. Ora ci serve modificare quel file di configurazione:

nano /etc/letsencrypt/renewal/www.mywebsite.com.conf

...

[renewalparams]
account = **************9e208
pref_challs = http-01,
authenticator = standalone
server = https://acme-v02.api.letsencrypt.org/directory
post_hook = /home/my_website/bin/my_website daemon
pre_hook = /home/my_website/bin/my_website stop

...

Lanciamo nostra web app e verifichiamo che tutto funzioni:

[root@localhost /home]$ my_website/bin/my_website start

Eseguiamo la prova di rinnovo dentro un altro console:

[root@localhost ~]$ certbot renew --force-renewal

Se tutto andato bene lanciamo commando per rinnovo automatico:

[root@localhost ~]$ certbot renew --dry-run

Aggiungendo pre_hook e post_hook alla configurazione la nostra web app si fermerà nel momento di rinnovo permettendo al certbot di lanciare il suo webserver, eseguire la verifica, dopo di che rilanciare la nostra web app. Altrimenti ci darà errore della porta :80 occupata dalla nostra web app.

Ci sono altri modi per eseguire il rinnovo senza mai fermare nostro webserver, ma sono più complessi e richiedo installazione e configurazione di altri programmi (nginx ad esempio).

Da poco ho trovato una libreria SiteEncrypt quale permette integrare direttamente nella nostra web app la verifica del certificato. Ma è ancora nei fasi iniziali e la sua integrazione la lascio per un altro post.

2022-04-19
Come eseguire la tua applicazione Phoenix usando Systemd

In questo post, esplorerò come sfruttare systemd per garantire che le phoenix o elixir app continuino a funzionare anche dopo un'interruzione anomala dell'intero sistemaLearn more