我正在尝试使用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,该 CA 的证书位于LocalMachine\TrustedRootCertificationAuthorities
在我的机器上。客户端证书有效,但验证失败,因为我们的 CA 未公开OCSP http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol端点。如果我创建一个 X509Chain 并要求它验证链而不检查吊销,那么一切都会通过。
所以我的问题是...为什么证书不随请求一起发送?我不认为它应该在发送客户端证书之前尝试验证客户端证书(这是服务器的工作)。
我不会在 Wireshark 日志中淹没您,但客户端不会发送证书。简而言之,我得到...
- [出]客户您好
- [在]服务器你好
- [在]证书
- [在]服务器你好完成
- [Out] 证书、客户端密钥交换、更改密码规范、加密握手消息
- [在]更改密码规范,加密握手消息
- [Out] 应用程序数据(大概是 GET 请求)
- [In] 应用程序数据(大概是 400)
- [输入] 加密警报(终止通道)
I thinknginx 正在做一些聪明的事情,当我无法发送证书时,它不会死掉,而是重新协商以允许它发送 400 响应正文(而不是一开始就无法创建通道)
无论如何,我不会发送真正的问题证书。有谁知道为什么?
如果有帮助的话,nginx 的日志坚持认为没有发送证书(而不是证书无效):
2012/11/22 14:16:26 [info] 27755#0: *799 客户端在读取客户端请求标头时未发送所需的 SSL 证书,客户端:10.0.0.200,服务器:10.0.0.100,请求:“GET /state HTTP /1.1”,主机:“10.0.0.100”
请不要使用下面的代码 - 它效率低下、不可靠并且仅用于测试
回复:获取证书:
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