Related pages: 🇬🇧 Setup HTTPS
1. Introduction
HTTPS signifie que votre connexion à Pwic.wiki est cryptée pour n'importe quel rôle. La preuve est d'avoir un cadenas dans la barre d'adresse de votre navigateur. Le problème est que l'émission d'un certificat doit se faire dans la confiance, sinon l'utilisateur reçoit un avertissement indiquant que l'identité du site web ne peut pas être vérifiée.
Il est très important d'éviter que vos mots de passe soient volés. Sur un réseau local, il est très facile d'intercepter les mots de passe si vous n'utilisez pas de connexion sécurisée. Sur Internet, c'est un peu différent mais le risque est exactement le même. Même si les tâches les plus critiques dans Pwic.wiki ne peuvent être effectuées qu'à partir d'un terminal (nécessairement crypté par défaut), ça n'est pas une raison pour ne pas sécuriser vos connexions.
Il existe plusieurs possibilités d'obtention d'un certificat :
La configuration de Pwic.wiki importe également selon si un reverse proxy est utilisé ou pas.
2. Génération des certificats
2.1. Gratuit et auto-signé
Ce type de certificat est certainement le moyen le moins cher pour faire des tests et déboguer. À aucun moment un tel certificat ne peut être reconnu pour un usage public, car vous pouvez signer n'importe quel site web de votre choix.
Le script suivant est disponible pour Linux sur lequel OpenSSL est installé. Il a été conçu par Mr.Buttons sur l'excellent forum StackOverflow et adapté par nos soins pour s'intégrer au code de Pwic.wiki. Enregistrez le script suivant dans le fichier pwic_cert.py
:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
import datetime
from os.path import isdir
from pwic_lib import PwicConst, PwicLib
# Helpers
def _ssl_input(topic: str, sample: str) -> str:
print('%s (ex: %s) : ' % (topic, sample), end='')
return input()
# Check the database
if not isdir(PwicConst.DB):
print('Error: the database is not created yet')
exit()
# Private key
key = rsa.generate_private_key(public_exponent=65537, key_size=2048, backend=default_backend())
with open(PwicConst.PRIVATE_KEY, 'wb') as f:
f.write(key.private_bytes(encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()))
# Public key
issuer = x509.Name([
x509.NameAttribute(NameOID.COUNTRY_NAME, _ssl_input('ISO code of the country on 2 characters', 'FR')),
x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, _ssl_input('Full country', 'France')),
x509.NameAttribute(NameOID.LOCALITY_NAME, _ssl_input('Your town', 'Paris')),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, _ssl_input('Your organization', 'Pwic.wiki')),
x509.NameAttribute(NameOID.COMMON_NAME, _ssl_input('Common name', 'Pwic.wiki')),
])
hosts = PwicLib.list(_ssl_input('Your hosts separated by space', 'www.your.tld'))
if len(hosts) == 0:
exit()
cert = x509.CertificateBuilder() \
.subject_name(issuer) \
.issuer_name(issuer) \
.public_key(key.public_key()) \
.serial_number(x509.random_serial_number()) \
.not_valid_before(datetime.datetime.utcnow()) \
.not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365 * 5)) \
.add_extension(x509.SubjectAlternativeName([x509.DNSName(h) for h in hosts]), critical=False) \
.sign(key, hashes.SHA256(), default_backend())
with open(PwicConst.PUBLIC_KEY, 'wb') as f:
f.write(cert.public_bytes(serialization.Encoding.PEM))
# Final output
print('\nThe certificates are generated:')
print('- Private key: ' + PwicConst.PRIVATE_KEY)
print('- Public key: ' + PwicConst.PUBLIC_KEY)
Après avoir exécuté ce script avec la commande python3 pwic_cert.py
, deux fichiers sont enregistrés dans le répertoire db/
. Les fichiers sont valables pour les 5 prochaines années et contiennent des informations très précises.
2.2. Gratuit avec Let's Encrypt
Let's Encrypt dans une initiative d'Internet qui propose des certificats gratuits reconnus partout dans le monde. La procédure est un peu complexe, car vous devez prouver que vous êtes propriétaire de votre domaine. En d'autres termes, Pwic.wiki doit déjà être configuré pour HTTP seul.
Nous utilisons le script proposé par diafygi, car il est open source, simple et auditable. Téléchargez le script et suivez les instructions du fichier readme. Si vous n'avez pas de reverse proxy, vous devez modifier le code spécifique PwicExtension.load_custom_routes
de Pwic.wiki afin que Let's Encrypt puisse accéder aux fichiers cryptographiques dans un dossier statique spécial. Attention à ne pas exposer vos clés privées dans ce dossier.
À la fin, vous lisez ce genre de compte-rendu :
python3 acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir . > ./signed_chain.crt
Parsing account key...
Parsing CSR...
Found domains: pwic.wiki
Getting directory...
Directory found!
Registering account...
Registered! Account ID: https://acme-staging-v02.api.letsencrypt.org/acme/acct/00000000
Creating new order...
Order created!
Verifying pwic.wiki...
pwic.wiki verified!
Signing certificate...
Certificate signed!
Les fichiers finaux sont domain.key
et signed_chain.crt
. Le certificat expire sous 90 jours.
2.3. Payant avec des autorités
Ces certificats ont une grande valeur mais aussi un coût élevé (des dizaines d'euros par an). Ce n'est certainement pas le moyen le moins cher d'obtenir HTTPS si votre site web est petit.
Consultez simplement le site web des autorités et de leurs revendeurs pour en savoir plus sur les différentes possibilités de certifier votre domaine.
3. Activer HTTPS dans Pwic.wiki
Les fichiers .key
et .crt
doivent être déplacés respectivement à l'endroit indiqué par les variables PwicConst.PRIVATE_KEY
et PwicConst.PUBLIC_KEY
definies dans le fichier pwic_lib.py
.
Mettez à jour l'option base_url
pour utiliser HTTPS en lançant python3 pwic_admin.py set-env base_url https://your-site.tld
par exemple.
3.1. Sans reverse proxy
C'est le comportement par défaut : Pwic.wiki écoute l'adresse 0.0.0.0
ou ::
et traite toutes les requêtes.
L'option https
doit être activée avec la commande : python3 pwic_admin.py set-env https X
.
3.2. Avec un reverse proxy
L'intérêt d'utiliser un reverse proxy est expliqué dans notre FAQ technique.
Dans cette situation, Pwic.wiki communique avec le reverse proxy sur un réseau local restreint et vous n'avez pas besoin de HTTPS. Au contraire, le reverse proxy gère les connexions sécurisées avec le monde extérieur et il a besoin de votre certificat. Reportez-vous à la documentation de votre reverse proxy pour réaliser la configuration.
4. Ouvrez votre pare-feu
La dernière étape consiste à redémarrer Pwic.wiki et votre reverse proxy (si nécessaire).
Adaptez également les règles NAT de votre pare-feu : HTTP tourne sur le port 80 et HTTPS sur le port 443 par défaut.
Revision #1 was last modified by gitbra
on 2023-12-11 at 00:00:00 — 5a9d1be908df0a6d