Aller au contenu

Ajout d'un certificat à un conteneur Windows

logo docker

Je vous propose ici un petit tutoriel permettant d’intégrer un root-certificat à un container Docker Windows. Même si cela reprend les mêmes principes que ce que nous connaissons sur Linux, s’y retrouver dans les images et les applications à utiliser n’est pas aussi trivial.

Installation des prérequis

Microsoft à intégré sa propre technologie de containers basée sur docker dans Windows Server 2016 utilisant Hyper-V. Hyper-v que j’ai redécouvert à travers la mise en place d’un environnement de dev, est simple à mettre en oeuvre, peu consommateur de ressources et qui peut être piloté avec des commandes PowerShell.

Il faut tout de même avoir:

  • Windows 10 Entreprise, Professionnel, Éducation ou Home
  • Processeur 64 bits avec traduction d’adresse de second niveau (SLAT).
  • Processeur prenant en charge les extensions de mode du moniteur de machine virtuelle (VT-c sur les processeurs Intel).
  • Au minimum 8 Go de mémoire.

Dans un premier temps il faut activer hyper-v sur votre poste Windows. Dans une fenêtre Powershell ouverte en tant qu’administrateur, taper les commandes suivantes :

Terminal window
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

Installation de Docker Desktop

Ici, je vais utiliser la version Desktop de Docker, mais cela fonctionne aussi sur la version Enterprise pour windows Server. Le lien de téléchargement

Si vous ne l’avez pas fait avant, vous serez invité à activer Hyper-V. Une fois l’installation réussie, cliquez sur Fermer pour terminer le processus d’installation.

Ah oui comme sur Linux, si votre compte administrateur est différent de votre compte utilisateur, vous devez ajouter l’utilisateur au groupe docker-users.

Un peu de customisation

Si vous voulez déplacer l’emplacement des données de Docker, il faut arrêter le service docker, éditer le fichier C:\ProgramData\Docker\daemon.json et y mettre ceci en modifiant le chemin (attention aux \).

{
"data-root": "e:\\dockerdata"
}

Ensuite redémarrer

Contraintes pour les projets dotnet utilisant le framework.

Mon projet porte sur la mise en place d’une intégration continue d’une application .Net Framework. Cette application était pour le moment faire sur le poste des développeurs avec Visual Studio.

Mais voila comme les conteneurs partagent le système d’exploitation hôte, vous ne pouvez exécuter que des conteneurs compatibles avec le noyau de votre système d’exploitation hôte. Sur Linux, pratiquement toutes les versions de Linux partagent le même noyau, donc tant que vous avez installé docker, vous êtes prêt à partir. Cependant, pour les applications .Net Framework, vous avez besoin d’un conteneur Windows qui ne peut s’exécuter que sur des hôtes Windows avec la fonctionnalité Containeurs Windows activée.

Toutes ces images sont disponibles ici.

Mon projet est de compiler des DDL et de les stocker dans serveur nuget hébergé par Nexus. Mais voila mon serveur Nexus utilise un certificate auto-signé. Et j’ai bataillé un peu pour l’intégrer à mon container de build, afin que nuget fonctionne.

Construction de l’image Docker de build .NET

Comme sur linux vous devez écrire un fichier Dockerfile. Ici un exemple d’image permettant de builder des projets dotnet qur j’ai trouvé sur le site de microsoft.

Attention à bien la première ligne permettant de modifier le caractère d’échappement !

# escape=`
# Use the latest Windows Server Core image with .NET Framework 4.8.
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
# Download the Build Tools bootstrapper.
ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
# Install Build Tools with the Microsoft.VisualStudio.Workload.AzureBuildTools workload, excluding workloads and components with known issues.
RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
--installPath C:\BuildTools `
--add Microsoft.VisualStudio.Workload.AzureBuildTools `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10240 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.10586 `
--remove Microsoft.VisualStudio.Component.Windows10SDK.14393 `
--remove Microsoft.VisualStudio.Component.Windows81SDK `
|| IF "%ERRORLEVEL%"=="3010" EXIT 0
# Define the entry point for the docker container.
# This entry point starts the developer command prompt and launches the PowerShell shell.
ENTRYPOINT ["C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

Intégration du certificat

Au départ je vous voulais utiliser Import-Certicat mais malheureusement ca ne fonctionnait pas car j’obtenais cette erreur:

Import-Certificate : UI is not allowed in this operation docker windows

Et je suis tombé sur cette astuce, qu’on utilise souvent mais fallait trouver le bon utilitaire. Ici on va utiliser une autre image et recopier juste l’utilitaire certoc.exe.

Ce qui donne pour le début du Dockerfile :

# escape=`
FROM microsoft/nanoserver:sac2016 AS tool
# Use the latest Windows Server Core image with .NET Framework 4.8.
FROM mcr.microsoft.com/dotnet/framework/sdk:3.5-windowsservercore-ltsc2019 AS build
COPY --from=tool /Windows/System32/certoc.exe .
COPY root-ca.cer .
RUN certoc.exe -addstore root root-ca.cer
...

Je continue l’exploration de Docker Windows, avec l’utilisation de msbuild pour compiler et packager les applications.