在 VB.NET .NET 4.61 中使用 Cert.pem 作为客户端证书作为转发代理

Using Cert.pem as Client cert in VB.NET .NET 4.61 for a forward proxy

我一直在尝试在 class 函数中传递自定义证书,但我显然做错了什么,因为它在握手时失败了。请看下面的代码。

 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 中,我会像这样为寻找更多 context/understanding 我想做的事情的人做:

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']

我认为您在这里有几个问题需要解决。

  1. 虽然您可以加载 PEM 文件,但它不是完整的证书,不能用作客户端证书。您需要一个包含 public 和私钥的证书文件,例如 P12 或 PFX。
  2. 您没有将您的证书分配给网络请求。我对 HttpClientHandler 没有太多经验,但从文档来看,您似乎会将 HttpClientHandler 转换为具有 ClientCertificates 属性 的 WebRequestHandler。

为清楚起见编辑 - 请阅读下面的评论以获得正确答案,基于 Python 代码。不需要客户证书和上述内容。证书只需要被信任。