簡體   English   中英

如何在 .net 中創建一個全新的 x509Certificate2?

[英]how to create a completely new x509Certificate2 in .net?

我從網上谷歌它,找到了許多示例來從 .net 中的文件生成一個新的 x509Certificate2,但沒有一個示例展示如何從 .net 開始生成一個全新的 x509Certificate2。

有沒有人可以告訴我如何在.net 中做到這一點?

非常感謝。

這是您可以使用的代碼:

    static X509Certificate2 GenerateCertificate(string certName)
    {
        var keypairgen = new RsaKeyPairGenerator();
        keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

        var keypair = keypairgen.GenerateKeyPair();

        var gen = new X509V3CertificateGenerator();

        var CN = new X509Name("CN=" + certName);
        var SN = BigInteger.ProbablePrime(120, new Random());

        gen.SetSerialNumber(SN);
        gen.SetSubjectDN(CN);
        gen.SetIssuerDN(CN);
        gen.SetNotAfter(DateTime.MaxValue);
        gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
        gen.SetSignatureAlgorithm("MD5WithRSA");
        gen.SetPublicKey(keypair.Public);           

        var newCert = gen.Generate(keypair.Private);

        return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
    }

為此,不要忘記添加對BouncyCastle 庫的引用

打開 ssl 以創建 x509 證書

1. 從以下鏈接下載 Win64 Openssl。(Win64 OpenSSL v1.1.0j - 37mb 安裝程序) URL - https://slproweb.com/products/Win32OpenSSL.html

2.安裝后設置系統路徑環境變量。(path = C:\\OpenSSL-Win64\\bin)

3.打開命令提示符並將目錄更改為桌面。

4.創建密鑰的命令: Private Key : openssl req -x509 -days 365 -newkey rsa:2048 -keyout cert-key.pem -out cert.pem輸入命令並按照說明進行操作。

5.現在我們在桌面上有兩個名為 cert-key.pem 和 cert.pem 的文件。 要創建 .pfx 文件,請運行以下命令openssl pkcs12 -export -in cert.pem -inkey cert-key.pem -out x509-cert.pfx並按照說明操作(輸入相同的密碼)。

6.創建公鑰的命令: openssl pkcs12 -in x509-cert.pfx -clcerts -nokeys -out x509-cert-public.pem並按照說明進行操作。

7.將證書注冊到mmc。

簽出CertificateRequest (名稱空間:System.Security.Cryptography.X509Certificates)...

 public static X509Certificate2 GenerateSelfSignedCertificate()
    {
        string secp256r1Oid = "1.2.840.10045.3.1.7";  //oid for prime256v1(7)  other identifier: secp256r1
        
        string subjectName = "Self-Signed-Cert-Example";

        var ecdsa = ECDsa.Create(ECCurve.CreateFromValue(secp256r1Oid));

        var certRequest = new CertificateRequest($"CN={subjectName}", ecdsa, HashAlgorithmName.SHA256);

        //add extensions to the request (just as an example)
        //add keyUsage
        certRequest.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, true));

        X509Certificate2 generatedCert = certRequest.CreateSelfSigned(DateTimeOffset.Now.AddDays(-1), DateTimeOffset.Now.AddYears(10)); // generate the cert and sign!

        X509Certificate2 pfxGeneratedCert = new X509Certificate2(generatedCert.Export(X509ContentType.Pfx)); //has to be turned into pfx or Windows at least throws a security credentials not found during sslStream.connectAsClient or HttpClient request...

     return pfxGeneratedCert;
}

您可以使用 PINVOKE 調用 Crypt32 以創建自簽名證書 有一些可用的示例代碼可以生成一個並將其放入證書存儲區。

還有 Keith Brown 的證書生成器,它是用托管代碼編寫的,並且有一個可以使用的庫

或者你可以使用使用BouncyCastle的Org.BouncyCastle.X509.X509V3CertificateGenerator和使用工具方法Org.BouncyCastle.Security.DotNetUtilities並調用ToX509Certificate()

如果您想創建一個請求並讓它由 CA 簽名,這在 .NET 中實際上更容易,因為大多數這些類都可以作為 COM 互操作 DLL 導入。 但這是另一個問題。

我認為您不能使用該 API 來做到這一點。 但是您可以使用 Bouncy Castle (http://www.bouncycastle.org) 創建一個,然后將該對象轉換為 X509Certificate2 對象(BC 有一些實用程序類可以這樣做)。

-edit- 看看這些 BC 類:X509V3CertificateGenerator 和 X509Certificate

稍后將 BC X509Certificate 對象轉換為常規 X509Certificate2 對象的 BC 實用程序類是:DotNetUtilities

public X509Certificate2 GetCertificate()
{
    var config = InitConfiguration();
    var certificateSubject = "X509Subject";
    var certificateStoreName = "X509StoreName";
    var certificateStoreLocation = "X509StoreLocation";
    var thumbPrint = "ThumbPrint";

    var storeName = (StoreName)Enum.Parse(typeof(StoreName), certificateStoreName, true);
    var storeLocation = (StoreLocation)Enum.Parse(typeof(StoreLocation), certificateStoreLocation, true);

    var certificateStore = new X509Store(storeName, storeLocation);
    certificateStore.Open(OpenFlags.ReadOnly);

    foreach (var storeCertificate in certificateStore.Certificates)
    {
        if (storeCertificate.Thumbprint.ToLower(System.Globalization.CultureInfo.CurrentCulture) == thumbPrint.ToLower(System.Globalization.CultureInfo.CurrentCulture))
        {return storeCertificate;
        }
    }
certificateStore.Close();
    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM