Usare un certificato TLS/SSL nel codice nel Servizio app di Azure

Nel codice dell'applicazione è possibile accedere ai certificati pubblici o privati aggiunti a servizio app. Il codice dell'app può fungere da client e accedere a un servizio esterno che richiede l'autenticazione del certificato oppure potrebbe dover eseguire attività di crittografia. Questa guida pratica illustra come usare certificati pubblici o privati nel codice dell'applicazione.

Questo approccio all'uso dei certificati nel codice usa la funzionalità TLS in servizio app, che richiede che l'app sia nel livello Basic o superiore. Se l'app è nel livello Gratuito o Condiviso , è possibile includere il file del certificato nel repository dell'app.

Quando si consente servizio app gestire i certificati TLS/SSL, è possibile gestire i certificati e il codice dell'applicazione separatamente e proteggere i dati sensibili.

Prerequisiti

Per completare questa guida pratica:

Trovare l'identificazione personale

Nel portale di Azure, nel menu a sinistra selezionare servizio app s<>app-name.>

Nel riquadro di spostamento a sinistra dell'app selezionare Certificati, quindi selezionare Bring your own certificates (.pfx) o Public key certificates (.cer).

Trovare il certificato da usare e copiare l'identificazione personale.

Copiare l'identificazione personale del certificato

Rendere accessibile il certificato

Per accedere a un certificato nel codice dell'app, aggiungere l'identificazione personale all'impostazione dell'app WEBSITE_LOAD_CERTIFICATES eseguendo il comando seguente in Cloud Shell:

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

Per rendere accessibili tutti i certificati, impostare il valore su *.

Nota

Quando WEBSITE_LOAD_CERTIFICATES è impostato *, tutti i certificati aggiunti in precedenza sono accessibili al codice dell'applicazione. Se si aggiunge un certificato all'app in un secondo momento, riavviare l'app per rendere il nuovo certificato accessibile all'app. Per altre informazioni, vedere Durante l'aggiornamento (rinnovo) di un certificato.

Caricare il certificato nelle app di Windows

L'impostazione WEBSITE_LOAD_CERTIFICATES dell'app rende i certificati specificati accessibili all'app ospitata di Windows nell'archivio certificati di Windows, in Utente corrente\My.

Nel codice C# si accede al certificato tramite l'identificazione personale del certificato. Il codice seguente carica un certificato con l'identificazione personale 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
}

Nel codice Java si accede al certificato dall'archivio "Windows-MY" usando il campo Nome comune soggetto (vedere Certificato di chiave pubblica). Il codice seguente illustra come caricare un certificato di chiave privata:

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
...

Per le lingue che non supportano o offrono supporto insufficiente per l'archivio certificati di Windows, vedere Caricare il certificato dal file.

Caricare il certificato dal file

Se è necessario caricare manualmente un file di certificato, è preferibile caricare il certificato usando FTPS anziché Git, ad esempio. È consigliabile mantenere i dati sensibili come un certificato privato fuori dal controllo del codice sorgente.

Nota

ASP.NET e ASP.NET Core in Windows devono accedere all'archivio certificati anche se si carica un certificato da un file. Per caricare un file di certificato in un'app .NET di Windows, caricare il profilo utente corrente con il comando seguente in Cloud Shell:

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

Questo approccio all'uso dei certificati nel codice usa la funzionalità TLS in servizio app, che richiede che l'app sia nel livello Basic o superiore.

L'esempio C# seguente carica un certificato pubblico da un percorso relativo nell'app:

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

Per informazioni su come caricare un certificato TLS/SSL da un file in Node.js, PHP, Python o Java, vedere la documentazione relativa al rispettivo linguaggio o piattaforma Web.

Caricare il certificato nei contenitori Linux/Windows

L'impostazione WEBSITE_LOAD_CERTIFICATES dell'app rende i certificati specificati accessibili ai contenitori personalizzati windows o Linux (inclusi i contenitori Linux predefiniti) come file. I file sono disponibili nelle directory seguenti:

Piattaforma contenitore Certificati pubblici Certificati privati
Contenitore Windows C:\appservice\certificates\public C:\appservice\certificates\private
Contenitore Linux /var/ssl/certs /var/ssl/private

I nomi dei file di certificato sono le identificazioni personali del certificato.

Nota

servizio app inserire i percorsi dei certificati nei contenitori di Windows come variabili WEBSITE_PRIVATE_CERTS_PATHdi ambiente seguenti, , WEBSITE_INTERMEDIATE_CERTS_PATHWEBSITE_PUBLIC_CERTS_PATHe WEBSITE_ROOT_CERTS_PATH. È preferibile fare riferimento al percorso del certificato con le variabili di ambiente anziché impostare come hardcoding il percorso del certificato, nel caso in cui i percorsi del certificato cambino in futuro.

Inoltre, i contenitori Windows Server Core e Windows Nano Server caricano automaticamente i certificati nell'archivio certificati, in LocalMachine\My. Per caricare i certificati, seguire lo stesso modello di Caricamento del certificato nelle app di Windows. Per i contenitori basati su Windows Nano, usare questi percorsi di file Caricare il certificato direttamente dal file.

Il codice C# seguente illustra come caricare un certificato pubblico in un'app 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

Il codice C# seguente illustra come caricare un certificato privato in un'app 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

Per informazioni su come caricare un certificato TLS/SSL da un file in Node.js, PHP, Python o Java, vedere la documentazione relativa al rispettivo linguaggio o piattaforma Web.

Durante l'aggiornamento (rinnovo) di un certificato

Quando si rinnova un certificato e lo si aggiunge all'app, viene ottenuta una nuova identificazione personale, che deve anche essere resa accessibile. Il funzionamento dipende dal tipo di certificato.

Se si carica manualmente il certificato pubblico o privato :

  • Se si elencano le identificazioni personali in modo esplicito in WEBSITE_LOAD_CERTIFICATES, aggiungere la nuova identificazione personale all'impostazione dell'app.
  • Se WEBSITE_LOAD_CERTIFICATES è impostato su *, riavviare l'app per rendere accessibile il nuovo certificato.

Se si rinnova un certificato in Key Vault, ad esempio con un certificato servizio app, la sincronizzazione giornaliera da Key Vault esegue automaticamente l'aggiornamento necessario durante la sincronizzazione dell'app con il certificato rinnovato.

  • Se WEBSITE_LOAD_CERTIFICATES contiene l'identificazione personale precedente del certificato rinnovato, la sincronizzazione giornaliera aggiorna automaticamente l'identificazione personale precedente alla nuova identificazione personale.
  • Se WEBSITE_LOAD_CERTIFICATES è impostato su *, la sincronizzazione giornaliera rende il nuovo certificato accessibile automaticamente.

Altre risorse