如何生成在我的计算机中有效的自认证 x509 证书



我需要构建一个自签名的 x509 证书,该证书可通过 C# 代码在我的计算机上识别为有效。

如果需要,可以使用管理员权限运行此操作。

我当前的代码如下

public static X509Certificate2 GenerateCertificate(string name)
{
    string subjectName = $"CN={name}";
    using (RSA rsa = RSA.Create(2048))
    {
        CertificateRequest req = new CertificateRequest(
            subjectName,
            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));
        return req.CreateSelfSigned(
            DateTimeOffset.UtcNow.AddDays(-1),
            DateTimeOffset.UtcNow.AddYears(50));
    }
}
public static X509Certificate2 GetOrCreateCertificate(string serverName)
{
    using (X509Store store = new X509Store(StoreLocation.LocalMachine))
    {
        X509Certificate2 certificate;
        store.Open(OpenFlags.ReadWrite);
        X509Certificate2Collection certificateCollection = store.Certificates.Find(X509FindType.FindBySubjectName, serverName, true);//With true, my certificates are not returned
        if (certificateCollection.Count > 0)
        {
            certificate = certificateCollection[0];
            return certificate;
        }
        certificate = GenerateCertificate(serverName);
        store.Add(certificate);
        return certificate;
    }
}

目前,如果我进入 Windows MMC,证书管理单元,我会看到证书,但它被认为是无效的。

我错过了什么?

编辑

  • 这是基于问题如何使用 C# 创建自签名证书?,这会生成被视为无效的证书。
  • 我想使用 .Net 4.7.2 中可用的 .Net 类,而不是 bouncyCastle,不是 com 对象或外部第三方库。

您遇到的问题似乎是系统不信任新证书。

为了受信任,证书链的根必须在以下存储之一中表示:

  • 本地计算机\根
  • 本地计算机\第三方根目录
  • 当前用户\根

(对于域管理的根颁发机构,还涉及一些其他存储(

所以在你这样做之后

certificate = GenerateCertificate(serverName);
store.Add(certificate);

你也会想做

using (X509Store rootStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
using (X509Certificate2 withoutPrivateKey = new X509Certificate2(certificate.RawData))
{
    rootStore.Open(OpenFlags.ReadWrite);
    rootStore.Add(withoutPrivateKey);
}

现在,系统将能够验证(单节点(链直到受信任的证书,并且 Find 上的validOnly: true约束将认为证书是"有效的"(对于该方法,这意味着链受信任且未过期(。

相关内容

  • 没有找到相关文章

最新更新