.Net 6.0 Ubuntu下HttpClient HTTPS请求报OpenSSL refcount error问题
解决Ubuntu 20.04 + .NET 6下HTTPS请求的OpenSSL refcount error问题
问题场景
在Ubuntu 20.04的.NET 6环境中,执行HTTPS请求时触发OpenSSL internal error: refcount error导致崩溃,但HTTP请求可正常执行,Windows系统下无此异常。
核心原因
OpenSSL版本兼容性缺陷
Ubuntu 20.04默认搭载的OpenSSL 1.1.1f存在引用计数管理的线程安全bug,而.NET 6在Linux平台依赖系统OpenSSL库处理HTTPS加密,当.NET的异步请求逻辑与该版本OpenSSL的资源管理逻辑冲突时,就会触发引用计数错误。同步阻塞异步代码的风险
使用.GetAwaiter().GetResult()同步阻塞异步的GetAsync方法,会打乱.NET的线程调度逻辑,在Linux线程池环境下,这种阻塞行为可能导致OpenSSL资源无法被正确释放,进而引发引用计数异常。
解决措施
1. 升级OpenSSL版本
OpenSSL 1.1.1n及以上版本修复了相关引用计数bug,执行以下命令升级系统OpenSSL:
sudo apt update sudo apt install --only-upgrade openssl libssl1.1
升级完成后重启应用,重试HTTPS请求。
2. 改用纯异步代码写法
避免同步阻塞异步方法,全程使用await调用:
async Task SendHttpsRequest() { using HttpClient client = new HttpClient(); var response = await client.GetAsync("https://www.google.com"); // 后续响应处理逻辑 }
异步调度能保证.NET线程池和OpenSSL资源管理的兼容性,避免引用计数异常。
3. 临时切换HTTP Handler(不推荐长期使用)
如果升级OpenSSL不可行,可通过环境变量切换到旧版HTTP Handler作为临时 workaround:
# 启动应用前设置环境变量 export DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0
或在代码中提前设置:
Environment.SetEnvironmentVariable("DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER", "0");
内容的提问来源于stack exchange,提问作者user8364961
相关产品推荐
相关产品推荐

