Aller au contenu principal

Forcer un certificat pour l'authentification

Introduction​

Deux certificats sont utilisés pour signer ou chiffrer des données liées à l'authentification.

Par défaut, ces certificats sont générés automatiquement dans le profil de l'utilisateur qui exécute le serveur web.

Attention

Si l'application se trouve derrière un load balancer, il est nécessaire de pré-générer le certificat à utiliser.

Générer un certificat​

Générer le certificat et la clé privée​

Générer le certificat
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout myapp.key -out myapp.crt -subj "/CN=myapp" -days 3653

Générer le fichier d'échange​

Générer le fichier pfx
openssl pkcs12 -export -passout pass: -out myapp.pfx -inkey myapp.key -in myapp.crt
Attention

Ne mettez pas de mot de passe sur le fichier pfx. Le paramètre -passout pass: sert à ignorer la demande de mot de passe.

Configurer le certificat​

Ajoutez le certificat à la racine du projet serveur, par exemple MyApp\Server\MyApp.pfx.

Ajoutez ensuite le fichier pfx dans le fichier du projet serveur.

MyApp.Server.csproj
<ItemGroup>
<None Update="MyApp.pfx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

Mettez le nom du fichier contenant le certificat dans la clé Lagoon:Authentication:OpendIdCertificate du fichier appsettings.json.

appsettings.json
{
"Lagoon": {
"Authentication": {
"OpendIdCertificate": "MyApp.pfx"
}
}
}
Remarques
  • La clé IdentityServer:Key:FilePath est utilisée si Lagoon:Authentication:OpendIdCertificate n'est pas définie.
  • Le serveur Lagoon vérifie aussi Lagoon:Authentication:CertificateThumbprint, Lagoon:Authentication:CertificateBase64 puis Lagoon:Authentication:CertificateFilePath avant la clé historique Lagoon:Authentication:OpendIdCertificate.

Fournir le certificat par une variable d'environnement ou un coffre​

Quand les secrets ne peuvent être fournis que sous forme de chaînes (variables d'environnement, coffre de secrets), mettez le certificat dans la clé Lagoon:Authentication:CertificateBase64. Aucun fichier n'est alors nécessaire : la clé privée reste en mémoire. Deux formes sont acceptées :

  • forme compacte, la plus courte : le base64 du certificat (DER), un point, puis le base64 de la clé privée (PKCS#8), sans en-tête PEM ni retour à la ligne ;
  • le base64 d'un fichier pfx, protégé ou non par le mot de passe de la clé Lagoon:Authentication:OpendIdCertificatePassword.
Générer la forme compacte (PowerShell 7)
$rsa = [System.Security.Cryptography.RSA]::Create(2048)
$request = [System.Security.Cryptography.X509Certificates.CertificateRequest]::new('CN=myapp', $rsa,
[System.Security.Cryptography.HashAlgorithmName]::SHA256, [System.Security.Cryptography.RSASignaturePadding]::Pkcs1)
$certificate = $request.CreateSelfSigned([DateTimeOffset]::UtcNow.AddDays(-1), [DateTimeOffset]::UtcNow.AddYears(3))
[Convert]::ToBase64String($certificate.RawData) + '.' + [Convert]::ToBase64String($rsa.ExportPkcs8PrivateKey())
Variable d'environnement
Lagoon__Authentication__CertificateBase64=MIIC...Q==.MIIE...Aw==

La méthode CertificateLoader.FromBase64 (espace de noms Lagoon.Server.Helpers) lit ces deux formes, et CertificateLoader.ToCompactBase64 produit la forme compacte d'un certificat : une application peut s'en servir pour ses propres certificats.

Attention

Cette clé passe avant Lagoon:Authentication:CertificateFilePath et Lagoon:Authentication:OpendIdCertificate, mais après Lagoon:Authentication:CertificateThumbprint. Le stockage local qui simule le cloud (CloudStorage:Local:RootPath) ne la lit pas : il utilise toujours Lagoon:Authentication:OpendIdCertificate.