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.
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
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
openssl pkcs12 -export -passout pass: -out myapp.pfx -inkey myapp.key -in myapp.crt
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.
<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.
{
"Lagoon": {
"Authentication": {
"OpendIdCertificate": "MyApp.pfx"
}
}
}
- La clé
IdentityServer:Key:FilePathest utilisée siLagoon:Authentication:OpendIdCertificaten'est pas définie. - Le serveur Lagoon vérifie aussi
Lagoon:Authentication:CertificateThumbprint,Lagoon:Authentication:CertificateBase64puisLagoon:Authentication:CertificateFilePathavant la clé historiqueLagoon: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.
$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())
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.
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.