我正在编写一个桌面应用程序,希望让用户能够验证网络流量,这样他们就知道自己没有被滥用。我的应用程序使用 .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/