Configuriamo Odoo con SSL

Letsencrypt + nginx

28 febbraio 2019
Andrea Cometa

SSL o "Secure Sockets Layer". Secure Sockets Layer è un protocollo progettato per consentire alle applicazioni di trasmettere informazioni in modo sicuro e protetto. Utilizzando i certificati SSL è possibile l'invio e la ricezione di chiavi di protezione che consentono di criptare/decriptare le informazioni trasmesse utilizzando le stesse chiavi.

Una delle attività prioritarie che abbiamo individuato prima di mettere in produzione l'istanza di Odoo della nostra associazione, è stata quella di mettere in sicurezza il sistema mediante una connessione sicura SSL. Questa guida segue quindi i passi che ho effettuato sul nostro server su cui è installato Debian 9.

Per questo abbiamo sicuramente bisogno di un certificato che possiamo acquistare da i numerosi fornitori disponibili in rete, oppure possiamo scegliere Letsencrypt così come ho fatto per www.odoo-italia.org, ma andiamo con ordine ed iniziamo con l'istallazione di nginx che utilizzeremo come proxy. È possibile utilizzare Apache ed ottenere lo stesso risultato, magari sarà oggetto di una prossima guida.

Iniziamo con l'aggiornamento dei repositories del sistema operativo ed installiamo gli strumenti necessari:

apt-get update && apt-get upgrade
apt-get install vim git (anche se dovremmo averli già installati)

quindi installiamo nginx:

apt-get install nginx

e scarichiamo i sorgenti di letsencrypt:

cd /opt/
git clone http://github.com/letsencrypt/letsencrypt

a questo punto configuriamo nginx affinchè serva sulla porta 80 e renda accessibile una directory temporanea per letsencrypt:

cd /etc/nginx/sites-available
vi miodominio 
server {
    listen 80;
    server_name www.miodominio.org;

    # LETSENCRYPT
    location '/.well-known/acme-challenge' {
      default_type "text/plain";
      root         /tmp/letsencrypt;
      autoindex    on;
    }

    access_log /var/log/nginx/miodominio.access.log;
    error_log  /var/log/nginx/miodominio.error.log;
}

dopo aver salvato, non dimentichiamo di creare la cartella /tmp/letsencrypt

a questo punto abilitiamo la configurazione appena salvata per nginx linkando il file nella cartella /etc/nginx/sites-enabled e ricarichiamo nginx

ln -s /etc/nginx/sites-available/miodominio  /etc/nginx/sites-enabled/ 
service nginx reload

ora lanciamo la prima volta letsencrypt in maniera da fargli scaricare automaticamente librierie necessarie e rispondiamo da terminale alle domande che ci pone, che ovviamente possono cambiare da release a release ma in linea di massima sono le seguenti:

/opt/letsencrypt/letsencrypt-auto

a questo punto farà i suoi downloads e nel caso gestissimo più configurazioni per i certificati,
inizierà chiedendoci quale per dominio attivare HTTPS. Quindi ci chiederà se effettuare il redirect da HTTP ad HTTPS,
io qui indico sempre 1 - no redirect, perchè preferisco modificare manualmente il file di configurazione visto che
devo successivamente indicare anche come raggiungere Odoo.
Quindi la procedura dovrà concludersi con un Congratulations! You have successfully enabled https://www.miodomino.org

Ora dobbiamo aggiungere la configurazione SSL ad nginx in maniera che possa servire Odoo sulla porta 443

cd /etc/nginx/sites-available
vi miodominio-ssl

upstream myOdoo { server localhost:8069; <<< qui è necessario specificare host e porta di Odoo }
server {
    listen 443;
    server_name www.miodominio.org;
    ssl on;
    ssl_ciphers                 ALL:!ADH:!MD5:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    ssl_certificate             /etc/letsencrypt/live/www.miodominio.org/fullchain.pem;
    ssl_certificate_key         /etc/letsencrypt/live/www.miodominio.org/privkey.pem;

[...]

    location / {
        proxy_pass              http://myOdoo;
[...]
    }

    # LETSENCRYPT
    location '/.well-known/acme-challenge' {
      default_type "text/plain";
      root         /tmp/letsencrypt;
      autoindex    on;
    }

    access_log /var/log/nginx/miodominio-ssl.access.log;
    error_log  /var/log/nginx/miodominio-ssl.error.log;
}

salviamo e linkiamo il file per attivarlo

ln -s /etc/nginx/sites-available/miodominio-ssl /etc/nginx/sites-enabled
service nginx reload

A questo punto il nostro Odoo sarà raggiungibile mediante HTTPS, ci sono sicuramente altri parametri che possono migliorare la configurazione qui esposta, come il redirect automatico da non-www a www e/o viceversa, ed è facile trovare in rete il materiale necessario, un esempio lo troviamo sulla guida ufficiale di Odoo. L'importante è che con queste indicazioni si riesca a mettere in sicurezza la nostra istanza di Odoo e si comprenda il meccanismo di base tra i vari componenti installati.

Concludo con un consiglio che è quello si configurare crontab affinchè esegua periodicamente l'aggiornamento dei certificati:

crontab -e
0 4 1 * * /opt/letsencrypt/letsencrypt-auto renew

in questo caso alle 4:00 di ogni primo del mese viene invocato il comando per aggiornare i certificati presenti.

Saluti