Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET SslStream:如何提取会话密钥?_C#_.net_Ssl_.net Core_Sslstream - Fatal编程技术网

C# .NET SslStream:如何提取会话密钥?

C# .NET SslStream:如何提取会话密钥?,c#,.net,ssl,.net-core,sslstream,C#,.net,Ssl,.net Core,Sslstream,我正在编写一个桌面应用程序,希望用户能够验证网络流量,这样他们就知道自己没有被滥用。我的应用程序使用with方法建立到服务器的TLS连接。Wireshark用户可以使用。我可以看到Firefox和Chrome都有记录加密密钥的选项。如何在.NET应用程序中执行相同的操作?i、 e.如何以编程方式从SslStream中提取会话密钥?在撰写本文时,使用dotnet的SslStream无法做到这一点。下面介绍如何使用以下方法导出会话密钥: 内部静态类BouncyCastlels { 公共静态流幽灵(流

我正在编写一个桌面应用程序,希望用户能够验证网络流量,这样他们就知道自己没有被滥用。我的应用程序使用with方法建立到服务器的TLS连接。Wireshark用户可以使用。我可以看到Firefox和Chrome都有记录加密密钥的选项。如何在.NET应用程序中执行相同的操作?i、 e.如何以编程方式从
SslStream
中提取会话密钥?

在撰写本文时,使用dotnet的
SslStream
无法做到这一点。下面介绍如何使用以下方法导出会话密钥:

内部静态类BouncyCastlels
{
公共静态流幽灵(流)
{
var client=new MyTlsClient();
var tlsClientProtocol=新的tlsClientProtocol(stream,new SecureRandom());
tlsClientProtocol.Connect(客户端);
返回tlsClientProtocol.Stream;
}
}
内部密封类MyTlsClient:DefaultTlsClient
{
公共覆盖TlsAuthentication GetAuthentication()
{
返回新的MyTlsAuthentication();
}
公共覆盖无效NotifyHandshakeComplete()
{
var clientRandom=mContext.SecurityParameters.clientRandom;
var masterSecret=mContext.SecurityParameters.masterSecret;
WriteLine(“CLIENT_RANDOM{0}{1}”、ToHex(clientRandom)、ToHex(masterSecret));
}
私有静态字符串ToHex(字节[]字节)
{
var sb=新的StringBuilder(bytes.Length*2);
对于(变量i=0;i
我认为您必须使用提供的证书解密http正文并检查它。否。我需要Diffie Hellman算法返回的临时密钥,否则Wireshark无法解码流量。是否有方法将此与
HttpClient
相结合?
internal static class BouncyCastleTls
{
    public static Stream WrapWithTls(Stream stream)
    {
        var client = new MyTlsClient();
        var tlsClientProtocol = new TlsClientProtocol(stream, new SecureRandom());
        tlsClientProtocol.Connect(client);
        return tlsClientProtocol.Stream;
    }
}

internal sealed class MyTlsClient : DefaultTlsClient
{
    public override TlsAuthentication GetAuthentication()
    {
        return new MyTlsAuthentication();
    }

    public override void NotifyHandshakeComplete()
    {
        var clientRandom = mContext.SecurityParameters.ClientRandom;
        var masterSecret = mContext.SecurityParameters.MasterSecret;

        Console.WriteLine("CLIENT_RANDOM {0} {1}", ToHex(clientRandom), ToHex(masterSecret));
    }

    private static string ToHex(byte[] bytes)
    {
        var sb = new StringBuilder(bytes.Length * 2);
        for (var i = 0; i < bytes.Length; ++i)
            sb.Append($"{bytes[i]:x2}");
        return sb.ToString();
    }

}

internal sealed class MyTlsAuthentication : TlsAuthentication
{
    public void NotifyServerCertificate(Certificate serverCertificate)
    {
    }

    public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest)
    {
        return null;
    }
}