web-dev-qa-db-ja.com

.NET Coreのファイルから読み込まずに、プログラムで有効な自己署名X509Certificate2を作成する方法

私が現在行っていることは、OpenSSLを使用してPFXファイルを生成することです。これは、特にWindowsユーザーにとって、望ましくない依存関係を引き起こしています。そのため、BouncyCastleを使用して独自の証明書を作成する方法の例をいくつか見つけましたが、このライブラリは.NET Core互換ではありません(または互換パッケージを見つけることができませんでした)。

では、.NETコアだけを使用して独自の自己署名X509証明書を作成し、OpenSSL(またはその他の証明書生成外部ツール)への依存を回避することは可能ですか?

EDIT:誰か(編集者?)から、これがSO質問 C#を使用した自己署名証明書? 回答を提供します。残念ながら、これは.NET Coreとは関係ありません。そこで受け入れられる回答はThis implementation uses the CX509CertificateRequestCertificate COM object (and friends - MSDN doc) from certenroll.dll to create a self signed certificate request and sign itで始まります。これは明らかに.NET Coreではありません。 。実際、.NET Coreと互換性のある答えはありません。

23
Wapac

私は this other SO question それが私を正しい軌道に乗せたことを発見しました。CertificatesAPIは2.0バージョンの.Net Coreに追加されました。次のような機能がありますIISで使用するために後でMyストアにインポートする自己署名証明書を作成します。

    private X509Certificate2 buildSelfSignedServerCertificate()
    {
        SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
        sanBuilder.AddIpAddress(IPAddress.Loopback);
        sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);
        sanBuilder.AddDnsName("localhost");
        sanBuilder.AddDnsName(Environment.MachineName);

        X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN={CertificateName}");

        using (RSA rsa = RSA.Create(2048))
        {
            var request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256,RSASignaturePadding.Pkcs1);

            request.CertificateExtensions.Add(
                new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature , false));


            request.CertificateExtensions.Add(
               new X509EnhancedKeyUsageExtension(
                   new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));

            request.CertificateExtensions.Add(sanBuilder.Build());

            var certificate= request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));
            certificate.FriendlyName = CertificateName;

            return new X509Certificate2(certificate.Export(X509ContentType.Pfx, "WeNeedASaf3rPassword"), "WeNeedASaf3rPassword", X509KeyStorageFlags.MachineKeySet);
        }
    }

Pfxが必要な場合は、X509Certificate2のExport関数でうまくいくはずです。生のpfxデータを含むバイト配列を返します。

25