【问题标题】:Providing an EC private key to certificate for use in HttpClient C#为证书提供 EC 私钥以在 HttpClient C# 中使用
【发布时间】:2019-07-08 10:01:28
【问题描述】:

我有一个可以使用 X509Certificate2 类读取的证书,如下所示:

X509Certificate2 证书 = 新 X509Certificate2(@"certificate.pem");

但我还有一个 EC 私钥。这是它的文件内容。

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIKpAuZ/Wwp7FTSCNJ56fFM4Y/rf8ltXp3xnrooPxNc1UoAoGCCqGSM49
AwEHoUQDQgAEqiRaEw3ItPsRAqdDjJCyqxhfm8y3tVrxLBAGhPM0pVhHuqmPoQFA
zR5FA3IJZaWcopieEX5uZ4KMtDhLFu/FHw==
-----END EC PRIVATE KEY-----

如何将此私钥“提供”给证书并最终提供给我的 HttpClient,以便它可以用作客户端证书?

这是我的其余代码:

X509Certificate2 certificate = new X509Certificate2(@"certificate.pem");
//certificate.PrivateKey = something;
httpClientHandler.ClientCertificates.Clear();
httpClientHandler.ClientCertificates.Add(certificate);
httpClientHandler.SslProtocols = SslProtocols.Tls12;
httpClientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;

HttpClient httpClient = new HttpClient(httpClientHandler);
HttpResponseMessage result = httpClient.GetAsync("https://server.cryptomix.com/secure/").Result;
string str = result.Content.ReadAsStringAsync().Result;

【问题讨论】:

  • @canton 这有什么关系? OP 已经在使用证书。问题是关于不同的东西
  • @canton7 这个问题不清楚。 EC 密钥存在。 Check this question for example。它们某些支付服务使用。它们不是证书

标签: c# ssl


【解决方案1】:

将证书和密钥与 openssl 结合起来,并将其输入 x509certificate 类即可:

openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out cert-and-key.pfx

然后使用它来获得一个分配了私钥的类:

X509Certificate2 certificate = new X509Certificate2("cert-and-key.pfx", "password");

然后我的问题中的代码有效。

【讨论】:

  • 接受的答案对我不起作用。它给出了错误:Could not load file or assembly 'BouncyCastle.Crypto, Version=1.8.9.0, Culture=neutral, PublicKeyToken=0e99375e54769942' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)。通过将 PEM 文件转换为 PFX 效果很好。
【解决方案2】:

我想我明白了...这使用了 BouncyCastle NuGet 包。

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using System.Security.Cryptography.X509Certificates;
using System;
using System.IO;

string pemKey = @"-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIKpAuZ/Wwp7FTSCNJ56fFM4Y/rf8ltXp3xnrooPxNc1UoAoGCCqGSM49
AwEHoUQDQgAEqiRaEw3ItPsRAqdDjJCyqxhfm8y3tVrxLBAGhPM0pVhHuqmPoQFA
zR5FA3IJZaWcopieEX5uZ4KMtDhLFu/FHw==
-----END EC PRIVATE KEY-----";

string pemCert = @"-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----";

var keyPair = (AsymmetricCipherKeyPair)new PemReader(new StringReader(pemKey)).ReadObject();
var cert = (Org.BouncyCastle.X509.X509Certificate)new PemReader(new StringReader(pemCert)).ReadObject();

var builder = new Pkcs12StoreBuilder();
builder.SetUseDerEncoding(true);
var store = builder.Build();

var certEntry = new X509CertificateEntry(cert);
store.SetCertificateEntry("", certEntry);
store.SetKeyEntry("", new AsymmetricKeyEntry(keyPair.Private), new[] { certEntry });

byte[] data;
using (var ms = new MemoryStream())
{
    store.Save(ms, Array.Empty<char>(), new SecureRandom());
    data = ms.ToArray();
}

var x509Cert = new X509Certificate2(data);

诀窍似乎是将证书和密钥组合到一个 pkcs12 容器中,然后一次性将其输入X509Certificate2

【讨论】:

  • 请参阅this answer 以解密加密的私钥。例如:-----BEGIN ENCRYPTED PRIVATE KEY-----
猜你喜欢
  • 2021-05-07
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多