Service en langage Dart: nom de domaine, SSL

Table des matières
  1. 1.
  2. 2. Backend
  3. 2.1. .
  4. 2.2. . SSL ( )
  5. 2.3. .
  6. ...
  7. 3. Web
  8. 3.1. “Under construction”
  9. ...
  10. 4. Mobile
  11. ...




avertissement (selon les commentaires de l'article précédent)
  • . .
  • , : .
  • , , , K8s, AWS, GKE . , . , , «», .
  • , : , .
  • . . , .
    • Dependency injection ( boilerplate)
    • ORM. .
    • oAuth2 + JWT . .
    • Deeplinks (Universal links/ App links). web/app
    • (websockets)
    • flutter






Nom de domaine



La dernière fois que nous nous sommes retrouvés là-dessus dans le conteneur de docker, nous avons lancé un serveur Web NGINX, distribuant un fichier statique index.html. Cette fois, nous étendrons les fonctionnalités du serveur Web en ajoutant le cryptage des données et des redirections forcées de http vers https.







Pour ce faire, vous devez résoudre un problème d'organisation: le fait est que le certificat de chiffrement ne peut être obtenu que pour un nom de domaine ou un groupe de noms. Pour cette raison, nous nous adressons à l'un des bureaux d'enregistrement de noms de domaine et choisissons un nom qui correspond à la marque (objectif, slogan, etc.) sans oublier l'objectif des noms de domaine de premier niveau. Dans mon cas, dartservice.ru est parfait . Pendant le processus d'inscription, vous devez remplir le formulaire d'informations sur le propriétaire, y compris le nom, l'adresse postale et l'e-mail. Ensuite, vous devez vous rendre dans la gestion des enregistrements DNS dans le panneau de configuration du bureau d'enregistrement et effectuer trois enregistrements:



  • Au moins deux enregistrements NS. Ce sont les noms des serveurs de noms de domaine du bureau d'enregistrement et leur nom est fourni par le bureau d'enregistrement lors de l'achat d'un nom de domaine.
  • Un enregistrement. Il s'agit directement d'un enregistrement de la relation entre le nom de domaine et l'adresse IP du serveur.


Dans mon cas, les enregistrements DNS ressemblent à ceci: après







avoir fait cela, vous ne devriez pas vous attendre à des résultats immédiats. L'échange d'informations entre les serveurs DNS prend généralement de 1 à 12 heures pour la zone RU. Ensuite ... ajoutez un autre test au projet /test/http/client.http







SSL



En général, bien sûr, SSL est un nom obsolète. Les nouvelles versions du protocole sont appelées TLS 1.0 ... 1.3, mais le mécanisme reste le même - le cryptage des données lors de la transition entre le protocole de la couche application (dans notre cas HTTP) et le protocole de la couche de transport (TCP / IP). En fait, vous avez besoin de:



  • Obtenez un certificat de chiffrement auprès d'une autoritĂ© de certification spĂ©ciale, confirmant la propriĂ©tĂ© du domaine correspondant.
  • NGINX.
  • .
  • , http https.


Il est généralement accepté pour le moment d'utiliser des certificats gratuits émis automatiquement par le service Let's encrypt . L'une des limites de ces certificats est la période de validité. Seulement 90 jours. Après cela, le certificat doit être obtenu à nouveau. Pour obtenir des certificats automatiquement (sans intervention humaine), le protocole et les applications ACME ont été développés pour effectuer périodiquement des actions pour confirmer la propriété du domaine. Let's encrypt recommande d'utiliser l'application certbot . Il est écrit en python et nécessite son propre référentiel et python3 pour être installé. Par conséquent, nous utiliserons un conteneur docker avec certbot installé à partir du registre DockerHub . Sélectionnons la dernière version stable de certbot / certbot: v1.5.0...



Voyons maintenant le mécanisme pour obtenir un certificat en utilisant le protocole ACME:



  • Lors du premier lancement, Certbot gĂ©nère une clĂ© privĂ©e et publique, puis crĂ©e un compte d'administrateur de domaine dans le service Let's encrypt, en transfĂ©rant la clĂ© publique et les informations de domaine.
  • Après cela, Let's encrypt envoie un message, que certbot doit signer avec une clĂ© privĂ©e et le renvoyer.
  • ertbot doit placer sur le serveur un fichier spĂ©cial disponible Ă  la lecture dans dartservice.ru/.well-known/acme-challenge pour confirmer la propriĂ©tĂ© de ce domaine.
  • Certbot compose une demande de certificat , l'envoie Ă  Let's encrypt et reçoit en retour un certificat pour le domaine.


Ajoutons le conteneur d'application Ă  notre script docker-compose.yaml :







Nouveau paramètre ici comand : voici la commande qui sera exécutée après le démarrage du conteneur. Dans ce cas, certonly (obtenez un certificat). L'obtention d'un certificat se fait en ligne, c'est-à-dire qu'il est nécessaire de répondre systématiquement à plusieurs questions. Passer des indicateurs après la commande vous permet de le faire sans intervention humaine: --webroot (méthode de confirmation) --webroot-path = / usr / share / nginx / html / letsencrypt (chemin où les fichiers de confirmation de propriété du domaine seront placés) --email admin @ email.com (messagerie de l'administrateur de domaine) - accord(accepter les termes du contrat de licence) --no-eff-email (ne pas signaler les e-mails aux développeurs certbot) -d dartservice.ru (liste des domaines).



Configurons le conteneur NGINX: Les







changements ici consistent à ouvrir le port https (443) et à monter les dossiers avec le certificat SSL et les fichiers de confirmation de propriété du domaine.



Un paramètre important est le dossier de clés Diffie-Hellman. En bref: cette clé est nécessaire pour échanger en toute sécurité des clés de chiffrement entre le serveur et le client lors de l'établissement d'une connexion. Plus de détails ici .



Générons une telle clé, mais nous serons confrontés au problème suivant: la clé est créée par le programme openssl, il s'agit d'un utilitaire de console Linux qui est peu susceptible d'apparaître sur notre machine Windows. La solution la plus simple consiste à exécuter notre script, à accéder à la console du conteneur Web et à y créer une clé, en passant le dossier hôte monté sur le conteneur dans le chemin de sortie du fichier:



Exécutez le script:



docker-compose up -d


Nous demandons une liste des conteneurs en cours d'exécution:



docker-compose ps






Ouvrez la console du conteneur:



docker exec -it srv_web_1 bash


Nous commençons à générer la clé dans le dossier de configuration NGINX (qui, comme nous nous en souvenons, est monté à partir de l'hôte):



openssl dhparam -out /etc/nginx/conf.d/dhparams.pem 2048






Déplacez la clé vers ./dhparams/dhparam-2048.pem



Quittez la console du conteneur Ctrl-D , arrĂŞtez le script:



docker-compose down


Modifions maintenant la configuration de NGINX ./conf.d/defaulf.conf :







Ajoutez un nouvel emplacement ^ ~ /.well-known/acme-challenge pour servir les fichiers statiques du dossier / usr / share / nginx / html / letsencrypt . C'est là que les fichiers de confirmation certbot seront placés. Configurons une redirection pour toutes les autres requêtes vers https.



Tout est prĂŞt pour le premier certificat SSL. Copions



notre projet sur le VPS dans un nouveau dossier / opt / srv_1 / avec la commande:



scp -r ./* root@91.230.60.120:/opt/srv_1/


Connectons-nous de VScode via SSH Ă  VPS.



Allons dans le dossier du serveur en cours d'exécution:



cd /opt/srv_0/


et arrĂŞtez le script:



docker-compose down


Allez maintenant dans le nouveau dossier du serveur cd / opt / srv_1 / et exécutez le script:



docker-compose up






Dans la console, nous voyons que certbot a créé un fichier de confirmation zeS4O87S6AfRQ3Kj4MaBlBFZx3AIiWdPn61DwogDMK4 et l'a signalé au service Let's encrypt, qui, à son tour, a demandé ce fichier à quatre adresses IP différentes, puis a émis un certificat. Le certificat sous la forme d'une chaîne complète et d'une clé privée ont été enregistrés dans le dossier correspondant. Le certificat est valable 90 jours (jusqu'au 05.10.2020).



Il est temps de créer un deuxième emplacement pour une connexion sécurisée dans la configuration NGINX sur le serveur ./conf.d/defaulf.conf :







Redémarrez le script
docker-compose restart


Voyons comment le navigateur réagit à notre certificat:







Google Chrome est satisfait de notre certificat. Maintenant, la tâche est plus compliquée - nous allons tester la sécurité et la disponibilité pour différents navigateurs de notre connexion SSL https://www.ssllabs.com/ssltest/ . Nous entrons l'adresse, et nous obtenons le résultat:







tout va bien avec le certificat et l'échange de clés (grâce à Diffie-Hellman), mais le robot de test a abaissé la note ("B" vaut "4" à notre avis) pour prendre en charge les protocoles TLS1.0 et TLS1.1 obsolètes ... Les désactiver dans la configuration NGINX n'est pas difficile, cependant, en regardant plus loin le rapport de test, nous voyons que, par exemple, les navigateurs de certains appareils mobiles dans ce cas ne pourront pas se connecter:











Il reste encore plusieurs tâches de service à effectuer.



Le nombre de tentatives d'obtention d'un certificat pour un domaine ne doit pas dépasser 5 dans les 7 jours. Après cela, le service Let's encrypt peut nous bloquer. Cependant, en exécutant le script pendant le développement chaque fois que certbot essaiera de le faire, donc dans le script docker-compose.dev.yaml, modifiez le paramètre de commande du conteneur certbot :







L' indicateur --dry-run est un test exécuté sans obtenir de certificat.



Écrivons un test:







code source github .



Conclusion



Ainsi, au cours de cette étape, nous avons sécurisé les communications entre les applications serveur et client et avons appris aux navigateurs à «faire confiance» à notre domaine.



Dans le prochain article, nous Ă©crirons une page Web flottante avec un compte Ă  rebours jusqu'au lancement de notre service, le collecterons et le placerons sur notre serveur.



All Articles