在机器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上的想法,将非常受赞赏。 谢谢