Skip to main content

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:

  1. Crear un parell de claus (pública i privada): Normalment s'utilitza l'algorisme RSA.

  2. Definir la informació del certificat: S'utilitza un "Distinguished Name" (DN) que inclou detalls com el nom comú (Common Name - CN), organització, etc.

  3. Crear la sol·licitud del certificat: S'utilitza la classe CertificateRequest.

  4. Generar el certificat: Es crea el certificat auto-signat a partir de la sol·licitud.

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

C#
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 a request.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 .pfx conté la teva clau privada. Assegura't de protegir-lo amb una contrasenya forta i de gestionar-lo de manera segura.