C#代理客户端证书

C# proxy a client certificate

我们正在构建一个网关,该网关将接收公司的信息请求,然后将请求转发给持有该信息的选定服务提供商。

EG

A公司---HTTPS请求--->我们的代理--->服务提供商A

A公司---HTTPS请求--->我们的代理--->B服务提供商。

其中一家服务提供商已强制请求公司使用他们颁发的客户证书。

这意味着我们必须传递客户端证书,而无需在我们的服务器上安装它,也不知道私钥。

目前我们正在使用虚拟 c# 客户端进行测试,模拟请求公司,我们可以通过

将客户端证书接收到我们的代理中
var clientCertificate = Request.HttpContext.Connection.ClientCertificate;

使用 kestrel 和 asp.net Core 1.0

然而,我们随后需要使用网络请求将客户端证书发送给服务提供商,例如

var req = (HttpWebRequest)WebRequest.Create(uri);

req.ClientCertificates.Add(clientCertificate);

我们注意到代理服务器获取的客户端证书没有私钥。鉴于其私钥,这是预期的。

我们无法让我们的测试 c# 客户端模拟请求公司到我们的代理,发送客户端证书,除非测试客户端有可用的私钥。

这让我们认为在不知道私钥的情况下无法使用客户端证书代理请求。

很遗憾,我们没有可用于测试的服务提供商接口,因为它目前正在构建中。

Q1 如果您没有可用的私钥,c# 会发送带有 Web 请求的客户端证书吗?

Q2 远程服务器是否接受没有私钥的证书,或者远程服务器是否需要请求主机(在本例中为我们的代理)拥有私钥,以便执行 SSL 握手和验证客户端证书?

我们正在尝试确定上述方案是否可以在代理不知道私钥的情况下工作。

如果那是可能的,那将违背客户证书的目的,因为任何人都可以拦截并使用它们来谋取私利,假装他们是实际的受让人。换句话说,你正试图成为一个旨在首先消除中间人的计划中的中间人。