[PYTHON] HTTPS avec Django et Let's Encrypt

introduction

J'utilise Python, ce qui est rare pour moi. J'ai dû écrire une application Web en Python au travail et j'ai utilisé Django. C'était la première fois que j'utilisais Django, mais j'ai trouvé que c'était un framework facile à utiliser. Avec un bon cadre et de gentils tutoriels, les différences dans les spécifications linguistiques ne sont pas trop perceptibles.

J'ai construit HTTP au travail, mais j'ai décidé d'essayer HTTPS avec Let's Encrypt, j'ai donc lancé cet article.

Construire un serveur

Créer un serveur AWS EC2

Cette fois, j'ai choisi Ubuntu. Je pense qu'Amazon Linux est basé sur CentOS, mais la version de sqlite est faible et Django ne peut pas être démarré.

django_https_1.PNG

--Sélectionnez Ubuntu 18.04 LTS comme type AMI.

django_https_2.PNG django_https_3.PNG

Après cela, il y a une confirmation des paramètres, et cliquez sur "Démarrer" pour démarrer.

django_https_4.PNG

La clé privée ne peut être téléchargée qu'ici et sans elle, vous ne pourrez pas vous connecter au serveur.

--Sélectionnez un groupe de sécurité pour la page d'instance.

django_https_5.PNG

django_https_6.PNG

--Cliquez sur "Ajouter une règle" pour ajouter HTTP et HTTPS afin qu'ils soient accessibles depuis "n'importe où" respectivement. Ajoutez également un autre "TCP personnalisé" et ajoutez le numéro de port 8000.

django_https_7.PNG

――Après vous être connecté, mettons à jour le package.

sudo apt update
sudo apt -y upgrade

Le menu grub sera mis à jour, alors sélectionnez "installer la version du responsable du paquet".

django_https_8.PNG

--Installez Apache HTTP Server.

sudo apt -y install apache2
sudo systemctl start apache2

Définissez le nom du serveur.

sudo vi /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        ServerName my.domain.jp

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Acquisition de domaine

Vous devrez obtenir un domaine car vous obtiendrez un certificat de serveur. Dans mon cas, j'utilise un service DDNS appelé MyDNS. Si vous avez besoin d'informations, veuillez voir ci-dessous.

MyDNS.JP privé

Créer un certificat de serveur avec Let's Encrypt

Installez certbot.

sudo apt -y install certbot python3-certbot-apache

Exécutez le shell certbot automatisé de Let's Encrypt.

sudo certbot --apache

Le certificat est créé en saisissant de manière interactive l'adresse e-mail et le nom du serveur comme indiqué ci-dessous.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: a

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: my.domain.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for my.domain.jp
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter](press 'c' to cancel): 2
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://my.domain.jp

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=my.domain.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/my.domain.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/my.domain.jp/privkey.pem
   Your cert will expire on 2020-09-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Vérifier avec le navigateur

Lorsque vous accédez à https://my.domain.jp/, l'écran par défaut d'apache2 s'affiche et vous pouvez voir que le certificat de serveur émis par Let's Encrypt est installé.

django_https_9.PNG

Créer une application Django

Créez une application Web à l'aide de Django.

Installation de Django

Puisque python est installé par défaut, installez pip et sqlite3.

sudo apt -y install python-pip sqlite3

Installez l'extension python OpenSSL.

pip install pyOpenSSL

Ensuite, installez Django.

sudo pip install Django

Django Extensions

Installez les extensions Django pour rendre votre serveur de développement Django compatible HTTPS.

pip install django-extensions

Installation de Werkzeug

pip install Werkzeug

Créer un projet Django

Créez un projet.

django-admin startproject letsencrypt
cd letsencrypt

Copiez le certificat du serveur Let's Encrypt et la clé privée dans votre dossier de projet.

sudo cp /etc/letsencrypt/live/my.domain.jp/fullchain.pem .
sudo cp /etc/letsencrypt/live/my.domain.jp/privkey.pem .
sudo chown ubuntu:ubuntu *.pem

Activez les extensions Django.

vi letsencrypt/settings.py

Ajoutez'django_extensions 'à la fin de INSTALLED_APPS. Ajoutez également le nom d'hôte à ALLOWED_HOSTS car vous devez autoriser l'accès par nom de serveur.

#Omission
ALLOWED_HOSTS = ['my.domain.jp']

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_extensions',
]
#Omission

Démarrage du serveur

Le serveur de développement Django est généralement démarré avec runserver, mais le serveur HTTPS est démarré avec runserver_plus. Spécifiez le fichier de certificat du serveur et le fichier de clé privée comme arguments.

python manage.py runserver_plus --cert-file ./fullchain.pem --key-file ./privkey.pem 0:8000

Contrôle de fonctionnement

Veuillez accéder à https://my.domain.jp:8000/ avec votre navigateur et vérifiez que vous pouvez vous connecter correctement avec HTTPS.

django_https_10.PNG

Environnement de confirmation

Ubuntu 18.04.4 LTS (Amazon EC2) Python 2.7.17

Site référencé

Faire exécuter le serveur de développement Django SSL / HTTPS | CentOS 7

Sécurité des documents Django dans Django

SECURE_PROXY_SSL_HEADER du document Django

Recommended Posts

HTTPS avec Django et Let's Encrypt
Paramètres du serveur HTTPS de Django Project: Let's Encrypt
SSL-active plusieurs sites sur un serveur avec nginx et Let's Encrypt
Essayons gRPC avec Go et Docker
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Crypter avec Ruby (Rails) et décrypter avec Python
Création de carte Ramen avec Scrapy et Django
Internationalisation avec Django
Enregistrement de domaine et conversion HTTPS de l'application Django créée avec CodeStar avec Route53
CRUD avec Django
Générer et publier des données d'image factice avec Django
Django: enregistrez l'agent utilisateur et gérez-le avec l'administrateur
Intégrons Django et apache (httpd) sur Mac! !!
Contrôlons les moteurs et capteurs EV3 avec Python
Faisons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 1] ~ Django setup ~
Authentifier Google avec Django
Transposons la matrice et multiplions les matrices par numpy.
Django 1.11 a démarré avec Python3.6
Télécharger des fichiers avec Django
Résumé du développement avec Django
Sortie PDF avec Django
Sortie Markdown avec Django
Utiliser Gentelella avec Django
Twitter OAuth avec Django
Essayez de créer un jeu simple avec Python 3 et iPhone
Premiers pas avec Django 1
Envoyer des e-mails avec Django
Téléchargement de fichiers avec django
Utilisez LESS avec Django
Créons une application Mac avec Tkinter et py2app
La mutualisation mécanise avec Django
Utiliser MySQL avec Django
Avec et sans WSGI
Django à partir d'aujourd'hui
Premiers pas avec Django 2
Créons un diagramme PRML avec Python, Numpy et matplotlib.
[Jouons avec Python] Traitement d'image en monochrome et points
Créer une fonction d'authentification à l'aide de django-allauth et CustomUser dans Django
Déplaçons word2vec avec Chainer et voyons la progression de l'apprentissage
Avec moi, cp et sous-processus
Chiffrement et déchiffrement avec Python
Jouons avec la 4e dimension 4e
Jouons avec les données Amedas - Partie 1
Travailler avec le tkinter et la souris
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
Python et matériel - Utilisation de RS232C avec Python -
Créer une API avec Django
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Déployer Django sans serveur avec Lambda
Python3 + Django ~ Mac ~ avec Apache
Premiers pas avec Python Django (1)
Créer une page d'accueil avec django
Faisons Othello avec wxPython
Lancez-vous avec Django! ~ Tutoriel ④ ~
Jouons avec les données Amedas - Partie 4
Premiers pas avec Python Django (4)
Créer une application Web avec Django
Premiers pas avec Python Django (3)