Ubuntu服务器上ASP.Net Core出现SSL握手错误求助
解决Ubuntu上ASP.NET Core HttpClient SSL握手错误(unsafe legacy renegotiation disabled)
这个错误的根源是目标服务器采用了不安全的旧版SSL重协商机制,而现代OpenSSL默认禁用了该机制,所以不管是ASP.NET Core的HttpClient还是curl发起请求都会失败。
针对ASP.NET Core应用的解决方案
直接配置HttpClientHandler
在创建HttpClient时,显式开启旧版重协商支持:
var handler = new HttpClientHandler(); handler.SslOptions.AllowLegacyRenegotiation = true; // 可选:指定目标服务器支持的SSL协议,比如TLS 1.2 handler.SslOptions.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12; var httpClient = new HttpClient(handler);
使用IHttpClientFactory注册(推荐)
如果项目用依赖注入管理HttpClient,在Startup/Program.cs中配置:
services.AddHttpClient("LegacyServerClient") .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { SslOptions = { AllowLegacyRenegotiation = true } });
之后在需要的地方注入IHttpClientFactory,获取命名客户端即可。
测试用curl的临时解决方法
运行curl时添加--legacy-renegotiation参数:
curl --legacy-renegotiation https://目标服务器地址
如果还有证书问题,可临时加上--insecure跳过证书验证(仅测试用):
curl --insecure --legacy-renegotiation https://目标服务器地址
全局OpenSSL配置(不推荐)
如果需要让所有应用都允许旧版重协商,可修改OpenSSL全局配置(会降低系统整体安全性,谨慎使用):
- 编辑
/etc/ssl/openssl.cnf文件 - 在
[openssl_init]区块下添加:
ssl_conf = ssl_sect
- 在文件末尾添加以下内容:
[ssl_sect] system_default = system_default_sect [system_default_sect] Options = UnsafeLegacyRenegotiation
- 保存文件后,重启ASP.NET Core应用或服务器生效。
注意:允许旧版重协商会引入安全风险,仅在目标服务器无法升级SSL配置的情况下临时使用,优先推动目标服务器升级到符合现代安全标准的SSL协议。
内容的提问来源于stack exchange,提问作者Scott Jodoin
相关产品推荐
相关产品推荐

