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
Où 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èshttp
ethttps
.ASPNETCORE_URLS="https://+;http://+"
est utilisé pour dire àKestrel
d'écouter sur les urls enhttps
ethttp
.ASPNETCORE_HTTPS_PORT=5001
permet de donner le port utilisé pour accéder enhttps
à 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 SecretsAzure Pipelines
par exemple.
Accédez à présent à votre conteneur sur l'url https://localhost:5001 et...
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 !
Commentaires