c# - Générer et signer une demande de certificat à l'aide de.net Framework pur



cryptography system.security (1)

J'essaie d'utiliser du code .net pur pour créer une demande de certificat et créer un certificat à partir de la demande de certificat par rapport à un certificat d'autorité de certification existant (disponible dans le magasin de certificats Windows ou dans un fichier séparé).

Je sais que j'ai les classes X509Certificate et X509Certificate2 disponibles pour charger des certificats et accéder à leurs informations, mais je ne vois aucune classe ou fonctionnalité dans l'espace de noms System.Security.Cryptography pouvant être utilisée pour créer une demande de certificat ou pour signer une telle demande de certificat pour créer un nouveau certificat signé.

Et cela bien que la documentation sur l'espace de noms System.Security.Cryptography.Pkcs indique:

L'espace de noms System.Security.Cryptography.Pkcs fournit des éléments de programmation pour les standards de cryptographie à clé publique (PKCS), y compris des méthodes de signature de données, d'échange de clés, de demande de certificats , de cryptage et de décryptage de clé publique et d'autres fonctions de sécurité.

Alors, comment puis-je créer une demande de certificat et signer cette demande pour créer un nouveau certificat X509 en utilisant uniquement les classes .net pures de System.Security.Cryptography ?

Remarque:

  • Je ne veux pas utiliser d'exécutable externe comme openssl ou MakeCert
  • Je ne veux pas utiliser BouncyCastle
  • Je ne souhaite pas utiliser l' API d'inscription de certificats Windows
  • Je ne souhaite pas utiliser les fonctions natives de l'API Win32

Réponse courte: Vous pouvez démarrer dans .NET Framework 4.7.2.

Cette fonctionnalité a été initialement ajoutée à .NET Core 2.0 sous la forme de la classe CertificateRequest , qui peut générer une demande de signature de certification PKCS # 10 ou un certificat de clé publique X.509 (auto-signé ou chaîné).

Les classes de cette fonctionnalité ont été rendues disponibles dans .NET Framework 4.7.2.

using (RSA parent = RSA.Create(4096))
using (RSA rsa = RSA.Create(2048))
{
    CertificateRequest parentReq = new CertificateRequest(
        "CN=Experimental Issuing Authority",
        parent,
        HashAlgorithmName.SHA256,
        RSASignaturePadding.Pkcs1);

    parentReq.CertificateExtensions.Add(
        new X509BasicConstraintsExtension(true, false, 0, true));

    parentReq.CertificateExtensions.Add(
        new X509SubjectKeyIdentifierExtension(parentReq.PublicKey, false));

    using (X509Certificate2 parentCert = parentReq.CreateSelfSigned(
        DateTimeOffset.UtcNow.AddDays(-45),
        DateTimeOffset.UtcNow.AddDays(365)))
    {
        CertificateRequest req = new CertificateRequest(
            "CN=Valid-Looking Timestamp Authority",
            rsa,
            HashAlgorithmName.SHA256,
            RSASignaturePadding.Pkcs1);

        req.CertificateExtensions.Add(
            new X509BasicConstraintsExtension(false, false, 0, false));

        req.CertificateExtensions.Add(
            new X509KeyUsageExtension(
                X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation,
                false));

        req.CertificateExtensions.Add(
            new X509EnhancedKeyUsageExtension(
                new OidCollection
                {
                    new Oid("1.3.6.1.5.5.7.3.8")
                },
                true));

        req.CertificateExtensions.Add(
            new X509SubjectKeyIdentifierExtension(req.PublicKey, false));

        using (X509Certificate2 cert = req.Create(
            parentCert,
            DateTimeOffset.UtcNow.AddDays(-1),
            DateTimeOffset.UtcNow.AddDays(90),
            new byte[] { 1, 2, 3, 4 }))
        {
            // Do something with these certs, like export them to PFX,
            // or add them to an X509Store, or whatever.
        }
    }
}

Réponse plus longue si vous êtes bloqué sur des versions plus anciennes: Pour atteindre votre objectif sans ajouter de nouveaux P / Invokes, vous devez lire et comprendre les documents suivants:

  • UIT-T X.680 -201508, le langage ASN.1
  • IETF RFC 5280 ou UIT-T X.509 , les documents expliquant les champs des certificats X.509.
  • IETF RFC 2986 , explique la demande de signature de certification PKCS # 10
  • UIT-T X.690 , explique la famille de codage BER pour ASN.1 (y compris DER) qui explique comment lire et écrire des octets pour obtenir la signification sémantique de X.509 / PKCS # 10.

Et puis vous pourriez écrire un graveur / lecteur DER et simplement émettre les octets pour ce que vous voulez.





system.security