如何从PowerShell的Invoke-WebRequest调用中获取TLS会话密钥?
解决PowerShell Invoke-WebRequest的TLS会话密钥导出问题
方案1:PowerShell 7+ 快速启用密钥日志
PowerShell 7基于.NET 5+,原生支持通过环境变量和开关启用SSL密钥日志:
- 设置
SSLKEYLOGFILE环境变量,指定密钥文件路径:$env:SSLKEYLOGFILE = "C:\temp\ssl_keys.log" - 启用.NET的SSL日志开关:
[System.AppContext]::SetSwitch("System.Net.Http.SslStreamLogging", $true) - 正常执行
Invoke-WebRequest或Invoke-RestMethod,TLS会话密钥会自动写入指定文件。
方案2:PowerShell 5.1 全局配置启用(基于.NET Framework)
PowerShell 5.1依赖.NET Framework,需要修改配置文件开启密钥日志:
- 设置系统或用户级环境变量
SSLKEYLOGFILE,指向目标日志文件(需重启PowerShell生效)。 - 编辑.NET Framework的配置文件:
- 64位系统路径:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config - 32位系统路径:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config - 在
<configuration>节点内添加:<runtime> <AppContextSwitchOverrides value="System.Net.Http.SslStreamLogging=true" /> </runtime>
- 64位系统路径:
- 重启PowerShell 5.1,执行请求后密钥会写入指定日志文件。
方案3:脚本内自定义捕获(跨版本通用)
如果不想修改全局配置,可通过自定义HttpClientHandler在脚本内直接捕获密钥:
$sslLogPath = "C:\temp\ssl_keys.log" # 创建自定义HttpHandler并订阅密钥日志事件 $handler = [System.Net.Http.HttpClientHandler]::new() $eventJob = Register-ObjectEvent -InputObject $handler -EventName "SslKeyLogEntry" -Action { param($sender, $e) Add-Content -Path $event.MessageData -Value $e.Entry } -MessageData $sslLogPath # 使用自定义Handler发送请求 $client = [System.Net.Http.HttpClient]::new($handler) $response = $client.GetAsync("https://your-api-url.com").Result # 按需处理响应内容 # Write-Output $response.Content.ReadAsStringAsync().Result # 清理资源 Unregister-Event -SourceIdentifier $eventJob.Name $client.Dispose() $handler.Dispose()
注意事项
- 确保日志文件所在目录有写入权限,建议提前创建目录(如
C:\temp)。 - 在Wireshark中配置密钥文件路径:
编辑 > 首选项 > Protocols > SSL > (Pre)-Master-Secret log filename,指定生成的日志文件即可解密HTTPS流量。
内容的提问来源于stack exchange,提问作者fulRicardosun
相关产品推荐
相关产品推荐

