Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何生成在我的计算机中有效的自我认证x509证书_C#_.net_X509certificate_X509_X509certificate2 - Fatal编程技术网

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

C# 如何生成在我的计算机中有效的自我认证x509证书,c#,.net,x509certificate,x509,x509certificate2,C#,.net,X509certificate,X509,X509certificate2,我需要构建一个自签名的x509证书,该证书通过C代码在我的计算机上被识别为有效 如果需要,可以使用管理员权限运行 我当前的代码如下 public static X509Certificate2 GenerateCertificate(string name) { string subjectName = $"CN={name}"; using (RSA rsa = RSA.Create(2048)) { CertificateRequest req = n

我需要构建一个自签名的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证书管理单元,我会看到证书,但它被认为是无效的

我错过了什么

编辑

这是基于生成被视为无效的证书的问题。 我想使用.Net 4.7.2中提供的.Net类,而不是bouncyCastle,也不是com对象或外部第三方库。
您遇到的问题似乎是系统不信任新证书

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

LocalMachine\Root LocalMachine\ThirdPartyRoot 当前用户\根用户 对于域管理的根权限,还涉及一些其他存储

所以,在你这样做之后

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);
}

现在,系统将能够验证单个节点链到可信证书,并且ValueIn:对查找的真实约束将考虑证书是有效的,对于该方法,意味着链信任和未过期。事实上,这是我问题的基础,但一旦创建了证书,它就被认为是invalid@SyntaxError很抱歉我想避免COM使用为什么仅将此证书添加到LocalMachine/Root无法工作?@J4N IIS和MMC以及其他许多软件都希望,如果您有一个带有私钥的证书,并且它位于存储区中,则它位于LocalMachine\My或CurrentUser\My;但是如果你控制了所有的软件,它应该可以工作。所以这只是不标准的