【问题标题】:400 No required SSL certificate was sent400 未发送所需的 SSL 证书
【发布时间】:2015-09-23 08:29:59
【问题描述】:

无法从 C# 客户端发送 https 请求。这是我的代码:

var client = WebRequest.Create("https://hastname.com/bla bla bla") as HttpWebRequest;
var cert = new X509Certificate2(File.ReadAllBytes("c:\\certs\\MyCert.pfx"), "MyPassword");
client.ClientCertificates.Add(cert);
result = new StreamReader(client.GetResponse().GetResponseStream()).ReadToEnd();

服务器端没问题,因为如果我在我的 mashine 证书存储中安装了证书,everythink 就可以了。

我比较 2 个请求: 1.从证书存储中删除证书,我从代码文件中加载它 2. 证书安装在证书存储中

在我的结果下方:

首先,我从文件中加载证书

Secure Protocol: Tls
Cipher: Aes256 256bits
Hash Algorithm: Sha1 160bits
Key Exchange: ECDHE_RSA (0xae06) 256bits

== Server Certificate ==========
[Subject]
  CN=xxx, OU=Web Services, O=xxx, S=England, C=GB

[Issuer]
  E=xx@xxx.com, CN=xxx Server Intermediate CA, OU=CA, O=xxx, S=England, C=GB

[Serial Number]
  1000

[Not Before]
  17.09.2015 12:51:29

[Not After]
  26.09.2016 12:51:29

[Thumbprint]
  xxxxxxxxxxxxxxxxxxxxxxxx7

然后我从本地 mashine 证书存储加载证书

Secure Protocol: Tls
Cipher: Aes256 256bits
Hash Algorithm: Sha1 160bits
Key Exchange: ECDHE_RSA (0xae06) 256bits

== Client Certificate ==========
[Subject]
  CN=WinClient, OU=Client Apps, O=xxx, S=England, C=GB

[Issuer]
  E=xx@xxxxx.com, CN=xxxx Client Intermediate CA, OU=CA, O=xxx, S=England, C=GB

[Serial Number]
  1000

[Not Before]
  17.09.2015 13:19:55

[Not After]
  26.09.2016 13:19:55

[Thumbprint]
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7


== Server Certificate ==========
[Subject]
  CN=xx.xxxxxxx.com, OU=Web Services, O=xxx, S=England, C=GB

[Issuer]
  E=xx@xxxxx.com, CN=xxx Server Intermediate CA, OU=CA, O=xxx, S=England, C=GB

[Serial Number]
  1000

[Not Before]
  17.09.2015 12:51:29

[Not After]
  26.09.2016 12:51:29

[Thumbprint]
  xxxxxxxxxxxxxxxxxxxxxx7

如您所见,第一个请求中没有客户端证书部分。我该如何解决我的问题?

附言我的观点是发送带有从文件加载的证书的请求,而不是从证书存储区。

【问题讨论】:

    标签: c# ssl nginx https


    【解决方案1】:

    首先,从字节数组创建 X509Certificate2 对象存在一些已知问题,请参阅此处的提示 5 http://paulstovell.com/blog/x509certificate2 了解更多信息。

    .pfx 文件可以包含多个证书,因此您需要加载它并遍历以找到您想要的一个,或者将它们全部添加。试试这个代码

    X509Certificate2Collection collection = new X509Certificate2Collection();
    collection.Import("c:\\certs\\MyCert.pfx", "MyPassword", X509KeyStorageFlags.PersistKeySet);
    client.ClientCertificates.AddRange(collection);
    

    【讨论】:

    • 嗨,凯夫。感谢您的回复。但这对我不起作用。
    猜你喜欢
    • 2016-07-17
    • 2019-08-31
    • 1970-01-01
    • 2019-07-22
    • 2022-12-30
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多