Qnap Certificats SSL sites Web

coeur51

Chevalier Jedi
19 Décembre 2015
336
4
18
Bonjour,

À la suite des différentes questions posées sur le forum concernant l'utilisation de SSL pour des sites Web hébergés sur nos NAS QNAP, je suis tombé sur ce tuto qui pourrait en dépanner plus d'un. Je reprécise que ce tu to n'est pas de moi et que par conséquent, je n'en n'assure pas le support :geek: Vous pouvez trouver le tuto ainsi que les outils ici : https://github.com/Yannik/qnap-letsencrypt. Le but étant de partager nos expériences ;)

Ce qui serait super, c'est que QTS SSL Certificate puisse gérer le multi-certificat multi-domaines :giggle:

Let's Encrypt sur QNAP

Instructions d'installation

Configuration du NAS
1. Connectez-vous à votre NAS et assurez-vous que l'application "Python 3.5" est installée.
2. Assurez-vous que votre NAS est accessible depuis l’internet public sous le domaine pour lequel vous souhaitez obtenir un certificat sur le port 80.
3. Créez un dossier pour stocker qnap-letsencrypt sous ‘/share/VOTRE_DOSSIER/’. Ne le créez pas directement dans ‘/share/’, car il sera perdu après un redémarrage !

Installer git
Si le package git est disponible pour votre modèle de NAS dans le QNAP App-Center, utilisez-le.
Sinon, [installez entware] (https://github.com/Entware/Entware/wiki/Install-on-QNAP-NAS). En dehors de git, il fournit beaucoup plus de packages utiles. Vous devrez peut-être installer "git-http" en plus de "git".
Après vous être déconnecté et reconnecté, vous pouvez utiliser ʻopkg install git` pour installer git.

Configuration d'un CA-bundle valide et clonage de ce dépôt

Par défaut, il n'y a pas de CA-bundle d'installé (ensemble de certificats racine auxquels nous devrions faire confiance). Par conséquent, nous devrons en télécharger un manuellement.
1. Sur votre ordinateur local avec un magasin de certificats intact, exécutez
curl --silent https://curl.haxx.se/ca/cacert.pem | sha1sum

2. Sur votre NAS, dans le répertoire dans lequel vous souhaitez installer qnap-letsencrypt, exécutez en SSH
curl --silent --location --remote-name --insecure https://curl.haxx.se/ca/cacert.pem
sha1sum cacert.pem

3. Comparez les hachages obtenus aux étapes 1 et 2, ils doivent correspondre.

4. Sur votre NAS, dans le répertoire dans lequel vous étiez auparavant
git config --system http.sslVerify true
git config --system http.sslCAinfo `pwd`/cacert.pem
git clone https://github.com/Yannik/qnap-letsencrypt.git
mv cacert.pem qnap-letsencrypt
cd qnap-letsencrypt
git config --system http.sslCAinfo `pwd`/cacert.pem

Configurer qnap-letsencrypt

1. Exécutez ‘init.sh’
2. Créez une demande de signature de certificat (CSR):
** Certificat pour un seul domaine : ** (remplacer nas.xxx.de avec votre nom de domaine)
openssl req -new -sha256 -key letsencrypt/keys/domain.key -subj "/CN=nas.xxx.de" > letsencrypt/domain.csr

** Certificat pour plusieurs domaines : ** (remplacer nas.xxx.de et nas.xxx.com avec vos noms de domaines)
```
cp openssl.cnf letsencrypt/openssl-csr-config.cnf
printf "subjectAltName=DNS:nas.xxx.de,DNS:nas.xxx.com" >> letsencrypt/openssl-csr-config.cnf
openssl req -new -sha256 -key letsencrypt/keys/domain.key -subj "/" -reqexts SAN -config letsencrypt/openssl-csr-config.cnf > letsencrypt/domain.csr

4. `mv /etc/stunnel/stunnel.pem /etc/stunnel/stunnel.pem.orig` (backup)

5. Exécutez `renew_certificate.sh`

6. ‘account.key’, ‘domain.key’ et même le CSR (selon acme-tiny readme) peuvent être réutilisés, il suffit donc de créer un cronjob pour exécuter "renew_certificate.sh" tous les soirs, qui renouvellera votre certificat s’il reste moins de 30 jours
Ajouter ceci à ‘/etc/config/crontab’:
30 3 * * * /share/CE_CACHEDEV1_DATA/qnap-letsencrypt/renew_certificate.sh >> /share/CE_CACHEDEV1_DATA/qnap-letsencrypt/renew_certificate.log 2>&1

Puis exécutez :
crontab /etc/config/crontab
/etc/init.d/crond.sh restart
```

FAQ
Pourquoi xxx ne fonctionne pas après un redémarrage ?
Tout ce qui est ajouté à l’un des répertoires suivants est supprimé après un redémarrage :
- `/root/` (`.gitconfig`, `.bash_history`)
- `/share/` (à l'exception de tout ce qui est ajouté aux lecteurs montés dedans)
- `/etc/ssl/`, `/etc/ssl/certs`

De plus, ce qui suit ne survit pas à un redémarrage :
- Cronjobs ajouté en utilisant `crontab -e`

Veuillez noter que les qpkgs sont installés dans `/share/CE_CACHEDEV1_DATA/.qpkg`. Pour cette raison, ils ne sont disponibles qu'après le déverrouillage du cryptage de vos disques.

Ce qui survit réellement à un redémarrage ?
- Tout ce qui se trouve sur un lecteur, par exemple. `/share/CE_CACHEDEV1_DATA/`
- `/etc/stunnel/stunnel.pem` (le certificat SSL utilisé pour l'interface web) semble survivre à un redémarrage.

Qu'en est-il après une mise à jour du firmware ?
Durant mes tests, tout ce qui précède s'est appliqué. Je n’ai rien perdu de plus.

Comment générer le contenu de `/etc/ssl/certs` ?
Ceci est uniquement documenté car cela faisait partie de mes recherches et n'est pas nécessaire pour la génération de certificat letsencrypt.

Tout d'abord, installez Perl depuis le gestionnaire d'applications Qnap.

Ensuite, dans votre répertoire qnap-letsencrypt:

mkdir certs
cat cacert.pem | awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "certs/cert" n ".pem"}'
wget --ca-certificate cacert.pem https://raw.githubusercontent.com/ChatSecure/OpenSSL/master/tools/c_rehash
/opt/bin/perl c_rehash certs
export SSL_CERT_FILE=`pwd`/cacert.pem
Vous pouvez maintenant copier ceci dans `/etc/ssl/certs`. Sinon, vous pouvez le faire directement dans `/etc/ssl/certs` si vous le souhaitez, mais rappelez-vous, qu'il est perdu après un redémarrage...

Comment tester si un script Python échoue en raison de certificats CA manquants
from urllib.request import urlopen # Python 3
urlopen("https://google.com")

Si vous obtenez ceci :
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
Quelque chose ne va pas.

N'oubliez pas d'exécuter `export SSL_CERT_FILE=cacert.pem` comme cela se fait dans `renew_certificates.sh`

Je ne sais pas si ce tuto est encore d'actualité mais bon...

Bonne journée