HttpWebRequest似乎没有发送客户端SSL证书

我试图使用HttpWebRequest来查询运行nginx的远程服务器。 我需要提供一个客户端证书来完成连接。

我正在做以下事情:

 Dim Request As HttpWebRequest = DirectCast(WebRequest.Create(Url), HttpWebRequest) Dim Cert = SSL.GetClientCertificate() Request.ClientCertificates.Clear() Request.ClientCertificates.Add(Cert) Dim Response As WebResponse = Request.GetResponse() 

SSL.GetClientCertificate只是一个辅助方法,它在本地机器上打开My存储并检索相应的证书(作为X509Certificate2 )。正在返回正确的证书。我也尝试从文件中加载证书相同的结果。)

就目前而言,当我到达Dim Response As...并且实际上试图打开连接时,我得到了一个400 Bad Request,它返回了以下内容:

 400 Bad Request No required SSL certificate was sent ----------------------------------- nginx/1.0.10 

我们使用我们自己的CA,在我的机器上的LocalMachine\TrustedRootCertificationAuthorities有一个证书。 客户端证书有效,但validation失败,因为我们的CA不公开OCSP端点。 如果我创build一个X509Chain并要求它validation链而不检查撤销,一切都会通过。

所以我的问题是…为什么没有与请求发送证书? 我不相信它应该试图validation客户端证书发送之前(这是服务器作业)。

我不会在Wireshark日志中泛滥,但客户端不会发送证书。 总之,我得到…

  • [Out]客户端你好
  • [中]服务器你好
  • [In]证书
  • [input] Server Hello Done
  • [出]证书,客户端密钥交换,更改密码规范,encryption的握手消息
  • [input]更改密码规范,encryption的握手消息
  • [Out]应用程序数据(大概是GET请求)
  • 应用数据(据推测是400)
  • [In]encryption警报(终止通道)

认为 nginx正在做一些聪明的事情,而不是在我发送证书失败时死亡,它重新协商允许它发送一个400响应主体(而不是首先创build一个通道)

无论如何,我并没有发出真正的问题证书。 有谁知道为什么?

如果有帮助,nginx的日志坚持不发送证书(而不是证书是无效的):

2012/11/22 14:16:26 [信息] 27755#0:* 799客户端在读取客户端请求标头时发送无需SSL证书,客户端:10.0.0.200,服务器:10.0.0.100,请求:“GET / state HTTP /1.1“,主机:”10.0.0.100“

请不要使用下面的代码 – 效率不高,不可靠,只用于testing

Re:获得证书:

 Public Shared Function GetClientCertificate() As X509Certificate2 Dim Store As New X509Store(StoreName.My, StoreLocation.LocalMachine) Dim Ret As X509Certificate2 = Nothing Try Store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly) For Each Certificate In Store.Certificates If Certificate.SubjectName.Name = "The subjectname of our certificate" Then Ret = Certificate Exit For End If Next Finally Store.Close() End Try Return Ret End Function 

您需要一个具有可访问私钥的证书,以便能够将其用作客户端(或服务器,就此而言)证书。

只要您授予任何需要使用证书访问其私钥的用户,就可以将证书存储在机器证书存储区中。 您不能使用.cer来验证客户端,因为它只包含公钥。 您可以通过为用户安装客户端证书并使用浏览器访问URL来测试所有内容。 如果您弹出选择证书,它已正确安装(为该用户)。