存储在远程计算机证书存储中的证书的私钥无效

时间:2020-08-18 08:44:07

标签: c# certificate private-key

在机器A上,我运行一个生成自签名证书的代码。生成后,我将创建的证书存储在远程计算机B上的存储中(“ \ hostname \ My”作为存储名)。最后,我尝试将此证书绑定到特定端口。在计算机A上生成证书时,将在C:\ Users \ All Users \ Microsoft \ Crypto \ RSA \ MachineKeys下创建相应的私钥容器文件。

但是,当证书存储在计算机B上时,它会按预期出现在存储中,并带有注释“您具有与此证书相对应的私钥”,但在C:\ Users \ All Users \ Microsoft \下没有对应的私钥容器文件机器B上的Crypto \ RSA \ MachineKeys。

此外,尝试导出此证书时,导出私钥的选项显示为灰色。结果,尝试绑定证书时出现以下错误“(0x80004005)指定的登录会话不存在。它可能已经终止”,这基本上表明私钥有问题。

当证书生成在存储证书的同一台计算机(B)上运行时,一切正常。 两台机器都在同一个域中,并且全部在域管理员帐户下完成。

这是使用BouncyCastle生成自签名证书的代码

public static X509Certificate2 GenerateCertificate(string subject)
        {

            var random = new SecureRandom();
            var certificateGenerator = new X509V3CertificateGenerator();

            var serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
            certificateGenerator.SetSerialNumber(serialNumber);

            certificateGenerator.SetIssuerDN(new X509Name($"C=NL, O=SomeCompany, CN={subject}"));
            certificateGenerator.SetSubjectDN(new X509Name($"C=NL, O=SomeCompany, CN={subject}"));
            certificateGenerator.SetNotBefore(DateTime.UtcNow.Date);
            certificateGenerator.SetNotAfter(DateTime.UtcNow.Date.AddYears(1));

            const int strength = 2048;
            var keyGenerationParameters = new KeyGenerationParameters(random, strength);
            var keyPairGenerator = new RsaKeyPairGenerator();
            keyPairGenerator.Init(keyGenerationParameters);

            var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
            certificateGenerator.SetPublicKey(subjectKeyPair.Public);

            var issuerKeyPair = subjectKeyPair;
            const string signatureAlgorithm = "SHA256WithRSA";
            var signatureFactory = new Asn1SignatureFactory(signatureAlgorithm, issuerKeyPair.Private);
            var bouncyCert = certificateGenerator.Generate(signatureFactory);

            X509Certificate2 certificate;

            Pkcs12Store store = new Pkcs12StoreBuilder().Build();
            store.SetKeyEntry($"{subject}_key", new AsymmetricKeyEntry(subjectKeyPair.Private), new[] { new X509CertificateEntry(bouncyCert) });
            string exportpw = Guid.NewGuid().ToString("x");

            using (var ms = new System.IO.MemoryStream())
            {
                store.Save(ms, exportpw.ToCharArray(), random);
                certificate = new X509Certificate2(ms.ToArray(), exportpw, X509KeyStorageFlags.Exportable);
            }
            return certificate;
        }

然后将其存储在远程计算机上

var cert = GenerateCertificate("Test Cert");
string storename = $"\\\\{hostname}\\{StoreName.My.ToString()}";
var store = new X509Store(storename, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

任何关于如何在机器A上正确生成证书,然后使用有效的私钥容器文件将其存储在远程机器B上的想法,将非常受赞赏。 谢谢

0 个答案:

没有答案