Generar certificat amb CSharp
Podem generar un certificat digital amb C# i .NET. La manera moderna i recomanada de fer-ho és utilitzant la classe CertificateRequest que es troba a l'espai de noms System.Security.Cryptography.X509Certificates. Aquesta classe et permet crear certificats auto-signats (per a desenvolupament i proves) o generar una Sol·licitud de Signatura de Certificat (CSR) per enviar a una Autoritat de Certificació (CA) pública.
Un certificat auto-signat
Un certificat auto-signat és útil per a entorns de desenvolupament, proves o comunicacions internes on no necessites la validació d'una tercera part de confiança.
El procés general és el següent:
-
Crear un parell de claus (pública i privada): Normalment s'utilitza l'algorisme RSA.
-
Definir la informació del certificat: S'utilitza un "Distinguished Name" (DN) que inclou detalls com el nom comú (Common Name - CN), organització, etc.
-
Crear la sol·licitud del certificat: S'utilitza la classe
CertificateRequest. -
Generar el certificat: Es crea el certificat auto-signat a partir de la sol·licitud.
-
Exportar el certificat: Normalment s'exporta a un fitxer
.pfx(o.p12) que inclou tant el certificat públic com la clau privada protegida amb una contrasenya.
Exemple
Aquí tens un exemple complet per generar un certificat RSA auto-signat i guardar-lo com a fitxer .pfx.
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
public class CertificateGenerator
{
public static void Main()
{
// 1. Definim la informació del certificat
string subjectName = "CN=elmeuserver.dev; O=La Meva Organitzacio";
string pfxPassword = "your-strong-password";
string pfxFilePath = "elmeucertificat.pfx";
try
{
// 2. Creem un parell de claus RSA de 2048 bits
using RSA rsaKey = RSA.Create(2048);
// 3. Creem la sol·licitud de certificat
var request = new CertificateRequest(
subjectName,
rsaKey,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
// 4. Afegim extensions bàsiques al certificat
request.CertificateExtensions.Add(
new X509BasicConstraintsExtension(false, false, 0, false));
request.CertificateExtensions.Add(
new X509KeyUsageExtension(
X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment,
false));
request.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, // Autenticació de servidor
false));
// 5. Creem el certificat auto-signat
// Definim una validesa d'1 any
DateTimeOffset notBefore = DateTimeOffset.UtcNow;
DateTimeOffset notAfter = notBefore.AddYears(1);
using X509Certificate2 certificate = request.CreateSelfSigned(notBefore, notAfter);
// 6. Exportem el certificat a un fitxer PFX (incloent la clau privada)
byte[] pfxBytes = certificate.Export(X509ContentType.Pfx, pfxPassword);
File.WriteAllBytes(pfxFilePath, pfxBytes);
Console.WriteLine($"Certificat generat amb èxit i guardat a: {pfxFilePath}");
}
catch (Exception ex)
{
Console.WriteLine($"S'ha produït un error: {ex.Message}");
}
}
}
Consideracions
-
Certificats auto-signats vs. Signats per una CA: Els certificats auto-signats no són de confiança per defecte per als navegadors web o altres sistemes operatius. Són ideals per a entorns de desenvolupament (per exemple, per habilitar HTTPS en
localhost), però no per a servidors de producció públics. -
Generació de CSR: Si necessites un certificat per a un lloc públic, en lloc de cridar a
request.CreateSelfSigned(...), hauries de cridar arequest.CreateSigningRequest()per generar un CSR. Aquest CSR l'hauries d'enviar a una Autoritat de Certificació (com Let's Encrypt, DigiCert, etc.) perquè el signin i et retornin un certificat de confiança. -
Seguretat de la clau: El fitxer
.pfxconté la teva clau privada. Assegura't de protegir-lo amb una contrasenya forta i de gestionar-lo de manera segura.