Utiliser un certificat TLS/SSL dans votre code dans Azure App Service

Dans votre code d’application, vous pouvez accéder aux certificats publics ou privés que vous ajoutez à App Service. Votre code d’application peut agir en tant que client et accéder à un service externe qui exige une authentification par certificat, ou il peut être amené à effectuer des tâches de chiffrement. Ce guide pratique explique comment utiliser des certificats publics ou privés dans le code de votre application.

Cette approche de l'utilisation des certificats dans votre code utilise la fonctionnalité TLS d'App Service, qui requiert que votre application soit au niveau De base ou supérieur. Si votre application se situe au niveau Gratuit ou Partagé, vous pouvez inclure le fichier de certificat dans le référentiel de votre application.

Lorsque vous confiez la gestion de vos certificats TLS/SSL à App Service, vous pouvez conserver les certificats et le code de votre application séparément et protéger vos données sensibles.

Prérequis

Pour effectuer les étapes de ce guide pratique, vous devez au préalable :

Trouver l’empreinte

Sur le portail Azure, dans le menu de gauche, sélectionnez App Services><nom-application>.

Dans le volet de navigation gauche de votre application, sélectionnez Certificats, puis Charger vos propres certificats (.pfx) ou Certificats de clé publique (.cer).

Trouvez le certificat que vous souhaitez utiliser et copiez-en l’empreinte.

Copier l’empreinte du certificat

Rendre le certificat accessible

Pour accéder au certificat dans le code de votre application, ajoutez son Thumbprint au paramètre d’application WEBSITE_LOAD_CERTIFICATES en exécutant la commande suivante dans Cloud Shell :

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>

Pour rendre tous vos certificats accessibles, définissez la valeur sur *.

Notes

Quand WEBSITE_LOAD_CERTIFICATES est défini sur *, tous les certificats déjà ajoutés sont accessibles au code d’application. Si vous ajoutez un certificat à votre application ultérieurement, redémarrez l’application pour rendre le nouveau certificat accessible à votre application. Pour plus d’informations, consultez Lors de la mise à jour (renouvellement) d’un certificat.

Charger le certificat dans les applications Windows

Le paramètre d’application WEBSITE_LOAD_CERTIFICATES rend les certificats spécifiés accessibles à votre application hébergée sur Windows dans le magasin de certificats Windows, dans Current User\My.

Dans le code C#, vous accédez au certificat par l’empreinte numérique du certificat. Le code suivant charge un certificat avec l’empreinte E661583E8FABEF4C0BEF694CBC41C28FB81CD870.

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;

string certThumbprint = "E661583E8FABEF4C0BEF694CBC41C28FB81CD870";
bool validOnly = false;

using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
  certStore.Open(OpenFlags.ReadOnly);

  X509Certificate2Collection certCollection = certStore.Certificates.Find(
                              X509FindType.FindByThumbprint,
                              // Replace below with your certificate's thumbprint
                              certThumbprint,
                              validOnly);
  // Get the first cert with the thumbprint
  X509Certificate2 cert = certCollection.OfType<X509Certificate2>().FirstOrDefault();

  if (cert is null)
      throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");

  // Use certificate
  Console.WriteLine(cert.FriendlyName);
  
  // Consider to call Dispose() on the certificate after it's being used, available in .NET 4.6 and later
}

Dans le code Java, vous accédez au certificat à partir du magasin « Windows-MY » par le biais du champ Subject Common Name (Nom commun de l’objet) (consultez Certificat de clé publique). Le code suivant montre comment charger un certificat de clé privée :

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.PrivateKey;

...
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null); 
Certificate cert = ks.getCertificate("<subject-cn>");
PrivateKey privKey = (PrivateKey) ks.getKey("<subject-cn>", ("<password>").toCharArray());

// Use the certificate and key
...

Pour les langages qui ne prennent pas en charge ou qui n’offrent pas de prise en charge suffisante pour le magasin de certificats Windows, consultez Charger un certificat à partir d’un fichier.

Charger un certificat à partir d’un fichier

Si vous devez charger un fichier de certificat que vous transférez manuellement vers le serveur, il est préférable de procéder à ce chargement en utilisant FTPS plutôt que Git, par exemple. Vous devez conserver les données sensibles, telles qu’un certificat privé, à l’écart du contrôle de code source.

Notes

ASP.NET et ASP.NET Core sur Windows doivent accéder au magasin de certificats, même si vous chargez un certificat à partir d’un fichier. Pour charger un fichier de certificat dans une application Windows .NET, chargez le profil d’utilisateur actif au moyen de la commande suivante dans Cloud Shell :

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_USER_PROFILE=1

Cette approche de l'utilisation des certificats dans votre code utilise la fonctionnalité TLS d'App Service, qui requiert que votre application soit au niveau De base ou supérieur.

L’exemple C# suivant charge un certificat public depuis un chemin relatif dans votre application :

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("~/<relative-path-to-cert-file>");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Pour voir comment charger un certificat TLS/SSL depuis un fichier dans Node.js, PHP, Python ou Java, consultez la documentation relative à la plateforme web ou au langage correspondant.

Charger le certificat dans les conteneurs Linux/Windows

Le paramètre d’application WEBSITE_LOAD_CERTIFICATES rend accessibles les certificats spécifiés à vos conteneurs personnalisés Windows ou Linux (y compris les conteneurs Linux intégrés) sous la forme de fichiers. Les fichiers se trouvent sous les répertoires suivants :

Plateforme de conteneur Certificats publics Certificats privés
Conteneur Windows C:\appservice\certificates\public C:\appservice\certificates\private
Conteneur Linux /var/ssl/certs /var/ssl/private

Les noms des fichiers de certificat sont les empreintes numériques de certificat.

Notes

App Service injecte les chemins de certificat dans les conteneurs Windows sous la forme des variables d’environnement suivantes WEBSITE_PRIVATE_CERTS_PATH, WEBSITE_INTERMEDIATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATH et WEBSITE_ROOT_CERTS_PATH. Il est préférable de référencer le chemin du certificat avec les variables d’environnement au lieu de le coder en dur, au cas où les chemins de certificat changeraient.

De plus, les conteneurs Windows Server Core et Windows Nano Server chargent automatiquement les certificats dans le magasin de certificats, dans LocalMachine\My. Pour charger les certificats, suivez le même modèle que dans Charger le certificat dans les applications Windows. Pour les conteneurs basés sur Windows Nano, utilisez ces chemins de fichier pour charger le certificat directement à partir d’un fichier.

Le code C# suivant illustre le chargement d’un certificat public dans une application Linux.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("/var/ssl/certs/<thumbprint>.der");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Le code C# suivant illustre le chargement d’un certificat privé dans une application Linux.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("/var/ssl/private/<thumbprint>.p12");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Pour voir comment charger un certificat TLS/SSL depuis un fichier dans Node.js, PHP, Python ou Java, consultez la documentation relative à la plateforme web ou au langage correspondant.

Lors de la mise à jour (renouvellement) d’un certificat

Quand vous renouvelez un certificat et l’ajoutez à votre application, il obtient une nouvelle empreinte, qui doit également être rendue accessible. Son fonctionnement dépend de votre type de certificat.

Si vous chargez manuellement le certificat public ou privé :

  • Si vous listez explicitement les empreintes dans WEBSITE_LOAD_CERTIFICATES, ajoutez la nouvelle empreinte au paramètre d’application.
  • Si WEBSITE_LOAD_CERTIFICATES est défini sur *, redémarrez l’application pour rendre le nouveau certificat accessible.

Si vous renouvelez un certificat dans Key Vault, par exemple avec un certificat App Service, la synchronisation quotidienne à partir de Key Vault effectue automatiquement la mise à jour nécessaire lors de la synchronisation de votre application avec le certificat renouvelé.

  • Si WEBSITE_LOAD_CERTIFICATES contient l’ancienne empreinte de votre certificat renouvelé, la synchronisation quotidienne met automatiquement à jour l’ancienne empreinte avec la nouvelle.
  • Si WEBSITE_LOAD_CERTIFICATES est défini sur *, la synchronisation quotidienne rend le nouveau certificat accessible automatiquement.

Plus de ressources