检测用于HttpClient POST或GET调用的TLS版本

时间:2019-01-07 19:43:02

标签: c# ssl

我正在尝试检索TLS版本信息。我下面的代码使用HttpClient成功进行了HTTP GET调用。我想念什么?在哪里可以从HttpClient获得TLS版本信息?

我做的事情与Which TLS version was negotiated?中所建议的相同,但特定于WebRequest,它与HttpClient不同。

static async Task MainAsync()
{
    Uri baseURI = new Uri("https://jsonplaceholder.typicode.com/posts/1");
    string apiPath = "";
    using (var client = new HttpClient())
    {
        client.BaseAddress = baseURI;
        HttpResponseMessage response = await client.GetAsync(apiPath);
        Console.WriteLine("HTTP status code: " + response.StatusCode.ToString());
        GetSSLConnectionInfo(response, client.BaseAddress.ToString(), apiPath);
    }
    Console.ReadKey();
}

static async Task GetSSLConnectionInfo(HttpResponseMessage response, string baseURI, string apiPath)
{
    using (Stream stream = await response.RequestMessage.Content.ReadAsStreamAsync())
    {
        BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
        Stream CompressedStream = null;
        if (stream.GetType().BaseType == typeof(GZipStream))
        {
            CompressedStream = (GZipStream)stream;
        }
        else if (stream.GetType().BaseType == typeof(DeflateStream))
        {
            CompressedStream = (DeflateStream)stream;
        }

        var objbaseStream = CompressedStream?.GetType().GetProperty("BaseStream").GetValue(stream);
        if (objbaseStream == null)
        {
            objbaseStream = stream;
        }

        var objConnection = objbaseStream.GetType().GetField("m_Connection", bindingFlags).GetValue(objbaseStream);
        var objTlsStream = objConnection.GetType().GetProperty("NetworkStream", bindingFlags).GetValue(objConnection);
        var objSslState = objTlsStream.GetType().GetField("m_Worker", bindingFlags).GetValue(objTlsStream);
        SslProtocols b = (SslProtocols)objSslState.GetType().GetProperty("SslProtocol", bindingFlags).GetValue(objSslState);
        Console.WriteLine("SSL Protocol Used for " + baseURI + apiPath + System.Environment.NewLine + "The TLS version used is " + b);
    }
}

我期望获得TLS连接信息,但出现异常。

2 个答案:

答案 0 :(得分:1)

内幕> Inf - Inf [1] NaN > 0/0 [1] NaN > digest(Inf - Inf) [1] "0d59b2dae9351c1ce6c76133295322d7" > digest(0/0) [1] "0d59b2dae9351c1ce6c76133295322d7" > digest(NaN) [1] "4e9653ddf814f0d16b72624aeb85bc20" 使用内部HttpClient类(例如您在TlsStream的示例中)。我们只需要在其他位置找到它。这是一个示例:

WebRequest

答案 1 :(得分:0)

您可以使用ServerCertificateCustomValidationCallback

轻松提取证书
Uri baseURI = new Uri("https://jsonplaceholder.typicode.com/posts/1");
string apiPath = "";
using (var client = new HttpClient(new HttpClientHandler
{
    ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) =>
    {
        Console.WriteLine(certificate2.GetNameInfo(X509NameType.SimpleName, false));
        return true;
    }
}))
{
    client.BaseAddress = baseURI;
    HttpResponseMessage response = await client.GetAsync(apiPath);
    Console.WriteLine("HTTP status code: " + response.StatusCode.ToString());
}