c# - .NET SSLStream : How to extract session key?

标签 c# .net ssl .net-core sslstream

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

最佳答案

在撰写本文时,无法使用 dotnet 的 SslStream 做到这一点。以下是使用 BouncyCastle 导出 session key 的方法:

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;
    }
}

关于c# - .NET SSLStream : How to extract session key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474622/

相关文章:

c# - 如何在 asp.net mvc View 中使用元组?

c# - 仅保留字符串中的前 20 个条目

c# - 使用来自后台任务的应用程序 resw 文件

Android Activity 和服务关系

c# - 正则表达式:匹配 JavaScript 源代码中的 'in' 运算符

javax.net.ssl.SSLPeerUnverifiedException : No peer certificate during amazons3 multipart upload

c# - EF Core 在内存中而不是 SQL 中执行 GroupBy 操作所需的解决方法

c# - foreach 父类(super class)列表中的继承(子类)对象

tomcat - Tomcat 6 的强 SSL

java - 如何使用 spring-ws 客户端使用不同的 keystore 调用同一个 webservice