Loupe

Docker : Mise en place du HTTPS dans un conteneur ASP.NET Core

Conteneurs ASP.NET Core et HTTPS

De nos jours, il est quasi obligatoire d'exécuter nos applications web en HTTPS, même si l'on souhaite "juste" y accéder pour la développer ! C'est pourquoi lorsque l'on travaille une application ASP.NET non-docker, Visual Studio nous met en place un certificat de développement qui permet d'exposer notre application web en https. Cependant, lorsque l'on souhaite exécuter cette même application dans un conteneur Docker, par défaut le seul le mode d'accès http est disponible !

Voyons dans cet article les différentes possibilités que l'on a pour sécuriser les accès à notre application web dans un conteneur :

Le plus facile : exécuter son conteneur en http derrière un reverse proxy exposé en https ?

Une des manières les plus simples, et aussi celle qui est supportée par défaut dans les web app Azure : conserver son conteneur exposé en http derrière un reverse proxy exposé en https.
L'avantage étant que l'on ne rajoute aucune complexité à son conteneur : On continue de l'exécuter comme on en avait l'habitude, et on doit "juste" configurer l'endpoint https du reverse proxy (on peut par exemple gérer le certificat à utiliser directement depuis le portail Azure)

On peut également utiliser Nginx en tant que reverse proxy. Vous pourrez trouver bon nombre de ressources sur le sujet sur internet, mais n'hésitez pas à jeter un coup d'oeil aux articles rédigé par mes collègues Thibaut et Thomas sur Créer un serveur de log avec Docker, Elastic Search, Kibana et Nginx : Architecture et mise en place et Héberger une application ASP.NET Core 2 sur un Raspberry Pi

Cependant, bien qu'étant une méthode plutôt simple, il y a parfois des moments où vous ne voulez ou ne pouvez pas utiliser un reverse proxy, auquel cas il est nécessaire d'activer le https directement dans le conteneur.

Voyons voir comment réaliser cette opération.

Utiliser SSL avec Kestrel dans Docker

Lorsque vous exécutez votre application ASP.NET Core en utilisant dotnet run, votre application web est hébergée sur le serveur web Kestrel, sur lequel il est possible de configurer le https.

En regardant la documentation officielle sur le sujet, on distingue 2 manières de le configurer : configuration pour un conteneur de développement, ou pour un conteneur de production.

La plupart des étapes de ces 2 procédés sont identiques, néanmoins la principale différence réside dans le fait que la version de développement utilise la fonctionnalité des user-secrets de la commande dotnet pour passer le mot de passe du certificat, alors que la version de production passe par une variable d'environnement.

Regardons plus en détail la version de production :

Tout d'abord, il nous faut un certificat :

  • Pour un environnement de production, il faudra probablement un certificat signé par une autorité de confiance telle que Let's Encrypt, VeriSign, GoDaddy, etc.
  • Pour les autres environnement, un certificat auto-signé peut tout à fait convenir (bien que sur ce genre de certificat, soit les utilisateurs auront tous la page toute moche Your connection is not private avant de pouvoir accéder à notre site web, soit il sera nécessaire d'installer notre certificat sur chacun des ordinateurs accédant au site web.).

Heureusement pour la deuxième option, il existe une commande de la dotnet CLI qui va nous aider : dotnet dev-certs.

Création d'un certificat auto-signé pour votre conteneur

Pour créer un certificat auto-signé, vous pouvez exécuter la ligne de commande suivante :

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\mycertificatename.pfx -p mycertificatepassword

mycertificatename.pfx correspond au nom du certificat, et mycertificatepassword correspond à son mot de passe.
Noter également que le certificat est stocké dans le dossier %USERPROFILE%\.aspnet\https qui contient les certificats générés via dotnet dev-certs.

Ensuite on aura besoin d'installer le certificat auto-signé (pour éviter le fameux message Your connection is not private).
Pour cela, 2 solutions : Soit en naviguant jusqu'au dossier contenant le certificat et en l'installant via double-clic, soit en utilisant la ligne de commande suivante :

dotnet dev-certs https --trust

Cette commande va rechercher les certificats contenus dans votre dossier %USERPROFILE%\.aspnet\https. Plutôt pratique n'est-ce pas ? :)

Exécuter votre conteneur en utilisant le certificat

Parfait, il est maintenant temps de passer aux choses sérieuses : Comment exécuter son conteneur et lui dire de sécuriser son accès en utilisant le certificat précédemment généré !

Pour cela, on a juste besoin de la ligne de commande suivante :

docker run --rm -it -p 5000:80 -p 5001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=5001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="mycertificatepassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/mycertificatename.pfx -v %USERPROFILE%\.aspnet\https:/https/ aspnetcore-react:latest

Où :

  • --rm et -it sont des paramètres standards de docker configurant le conteneur pour qu'il s'auto-détruise une fois terminé, et pour qu'il affiche les logs applicatifs sur la sortie de la console.
  • -p 5000:80 et -p 5001:443 sont les mappings pour les accès http et https.
  • ASPNETCORE_URLS="https://+;http://+" est utilisé pour dire à Kestrel d'écouter sur les urls en https et http.
  • ASPNETCORE_HTTPS_PORT=5001 permet de donner le port utilisé pour accéder en https à l'application.
  • -v %USERPROFILE%\.aspnet\https:/https/ est utilisé pour monter le dossier local %USERPROFILE%\.aspnet\https, contenant le certificat, dans le dossier /https à l'intérieur du conteneur.
  • -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/mycertificatename.pfx est utilisé pour spécifier où trouver le certificat à l'intérieur du conteneur.
  • ASPNETCORE_Kestrel__Certificates__Default__Password="mycertificatepassword" est utilisé pour spécifier le mot de passe du certificat. Bien entendu, pour un environnement de production, on veillera à protéger cette donnée sensible en la passant au conteneur via des Secrets Azure Pipelines par exemple.

Accédez à présent à votre conteneur sur l'url https://localhost:5001 et...

victory.PNG

Félicitations, c'est terminé ! J'espère que cet article vous aura aidés à démarrer plus facilement avec Docker et ASP.NET Core.

Que le code soit avec vous !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus