我一直在尝试在类函数中传递自定义证书,但我显然做错了什么,因为它在握手时失败。请参阅下面的代码。
Public Shared Async Function RevealViaForwardProxy(ByVal redactData As String) As Task(Of String)
Dim proxy = New WebProxy($"http://{forwardProxy}")
Dim cert As X509Certificate = X509Certificate.CreateFromCertFile("c:/Users/User/vb/cert.pem")
Dim credentials = New NetworkCredential(username, password)
proxy.Credentials = credentials
Dim client = New HttpClientHandler()
client.Proxy = proxy
client.BaseAddress = New Uri("https://httpbin.org/")
Dim response = Await client.PostAsync("/post", New StringContent(redactData))
Dim responseBody = Await response.Content.ReadAsStringAsync
Return JObject.Parse(responseBody)("data").ToObject(Of String)
End Function
例如,在 Python 中,对于寻求更多上下文/理解我想做的所有事情的人来说,我会这样做:
def reveal_via_forward_proxy(tokenized_data):
r = requests.post(
'https://httpbin.org/post',
data=tokenized_data,
headers={"Content-type": "application/json"},
proxies={"https": "https://{}:{}@{}".format(username, password, forward_proxy)},
verify='cert.pem'
)
assert r.status_code == 200
return r.json()['data']
我认为您在这里有几个问题需要解决。
- 虽然您可以加载 PEM 文件,但该文件不是完整的证书,不能用作客户端证书。 您需要一个同时包含公钥和私钥的证书文件,例如 P12 或 PFX。
- 您没有将证书分配给 Web 请求。 我对 HttpClientHandler 没有太多经验,但从文档中可以看出,您将 HttpClientHandler 强制转换为具有 ClientCertificates 属性的 WebRequestHandler。
为清楚起见,请阅读下面的评论以获取基于Python代码的正确答案。 不需要客户端证书和上述内容。 证书只需要受信任。