从 HTTPS 请求中获取加密数据以手动使用证书 C#

Get encrypted data from HTTPS request to use certificate manually C#

我正在为我的项目尝试这个:

  1. 我想从给定的 url(或从后期的 diff 位置)下载(根)证书
  2. 然后我想从给定的 url 获取数据并使用我在第一步中下载的证书来“解密它们”
  3. 如果第 1 步和第 2 步得到与服务器响应相同的结果,请检查给定 url 的响应

基本上我正在尝试创建一些东西来检查给定的证书是否适用于给定的 url 与自动给定的相同。

最好在一个请求中完成所有 3 个步骤(所以如果给定 url 有访问计数器,整个过程只是网站上的一次访问)

我可以很好地完成第 1 步)

var client = new TcpClient(address.ToString(), 443);
var certValidation = new RemoteCertificateValidationCallback(delegate (object snd, X509Certificate certificate, X509Chain chainLocal, SslPolicyErrors sslPolicyErrors)
                {
                    return true; //Accept every certificate, even if it's invalid
                });

// Create an SSL stream and takeover client's stream
using (var sslStream = new SslStream(client.GetStream(), true, certValidation))
{
    sslStream.AuthenticateAsClient(InputWWW.Text);
    var serverCertificate = sslStream.RemoteCertificate;
    cert = new X509Certificate2(serverCertificate);
}

但我找不到任何在本地获取原始数据的热门技巧。

到目前为止我只发现了这样的东西,我在请求处理程序中使用了证书

WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateValidationCallback = (a, b, c, d) => { return true; };
handler.ClientCertificates.Add(certificate);

这是证书的用途。

我想要这样的东西:

var binary/StringBlob = webRequest.getRawData(url,port);

var serverResponseManualy = applyCertificate/publicKey(binary/StringBlob, X509Certificate2 certificate );

checkBodyEquals(serverResponseManually, webRequest.GetResponse());

你知道怎么做吗,或者我应该搜索什么?

是否可以在对服务器的一次请求中完成所有这些操作?

谢谢

所以我能够获得有关 https 的更多信息,之后我发现我问这个问题的方式不正确。因为证书(非对称加密)仅用于创建对称密钥,用于encryption/description。所以无法获取私钥加密的消息