将证书添加到存储然后检索它

问题描述 投票:0回答:1

免责声明:我花了 2 天时间阅读有关证书/RSA 算法和加密/解密的内容。

我正在尝试制作一个与 Windows 密钥存储(证书存储)通信的小应用程序,并且我应该能够在其中读取证书/添加证书。

我创建了一个添加证书的方法。

public void AddKey()
{
    CngKey cngKey;
    CngKeyCreationParameters cng = new CngKeyCreationParameters
    {
        KeyUsage = CngKeyUsages.AllUsages
    };
    if (!CngKey.Exists(KEY_NAME))
    {
        cngKey = CngKey.Create(CngAlgorithm.Rsa, KEY_NAME, cng);
    }
    else
    {
        cngKey = CngKey.Open(KEY_NAME);
    }
    RSACng rsaKey = new RSACng(cngKey)
    {
        KeySize = 2048
    };
    byte[] rsaPrvKeyExport = rsaKey.Key.Export(CngKeyBlobFormat.GenericPrivateBlob);
    byte[] rsaPubKeyExport = rsaKey.Key.Export(CngKeyBlobFormat.GenericPublicBlob);
    CngKey cngPrv = CngKey.Import(rsaPrvKeyExport, CngKeyBlobFormat.GenericPrivateBlob);
    CngKey cngPub = CngKey.Import(rsaPubKeyExport, CngKeyBlobFormat.GenericPublicBlob);
    string exportPrivateKey = Convert.ToBase64String(rsaKey.ExportPkcs8PrivateKey());
    string pemString = $"{Constants.RSA_KEY_HEADER}\n{exportPrivateKey}\n{Constants.RSA_KEY_FOOTER}";
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadWrite);
    var certificate = BuildSelfSignedServerCertificate(rsaKey);
    var thumbprint = certificate.Thumbprint;
    store.Certificates.Add(certificate);
    store.Close();
} 

我知道并非需要此代码中的所有行,但我正在学习过程中。

所以我在这里做的是创建一个 cngKey 开店。 从我的 cngKey 创建证书 将证书添加到商店 关店了。

我使用此代码从 cngKey 生成证书

private X509Certificate2 BuildSelfSignedServerCertificate(RSA key)
{
    X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN={Constants.CERTIFICATE_NAME}");
    var request = new CertificateRequest(distinguishedName, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    request.CertificateExtensions.Add(
        new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));
    request.CertificateExtensions.Add(
       new X509EnhancedKeyUsageExtension(
           new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));
    var certificate = request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));
    certificate.FriendlyName = Constants.CERTIFICATE_NAME;
    return new X509Certificate2(certificate.Export(X509ContentType.Pfx, "WeNeedASaf3rPassword"), "WeNeedASaf3rPassword", X509KeyStorageFlags.MachineKeySet);
}

这没有给出错误,但是当我打开证书存储时我找不到它

enter image description here

我还尝试以编程方式检索它

使用这段代码

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates;

但是我的证书不在这里。

我错过了什么,我确信我做错了什么,但作为新手,我不知道是什么。

在网上我找不到我试图在这里实现的完整示例。

c# windows rsa x509certificate2
1个回答
3
投票

正如 @dimitar.bogdanov 在评论中指出的那样,您没有将证书添加到商店中:

store.Certificates.Add(certificate);

此处您仅将证书添加到断开连接的集合中。此集合对象中的任何更改都不会反映实际的商店状态。相反,您必须使用 X509Store.Add 方法来更新实际商店。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.