C#控制台应用使用RestSharp报错:请求已中止,无法创建SSL/TLS安全通道
报错根因
该错误核心是你代码中强制指定使用已被全球广泛废弃的SSL 3.0协议,当前绝大多数公开服务接口早已停止支持SSL 3.0,同时.NET Framework 4.0版本默认未原生开启高版本TLS协议支持。
排查步骤
- 确认目标接口支持的TLS协议版本:可通过浏览器访问接口域名,点击地址栏安全标识查看连接使用的加密协议,目前绝大多数接口最低要求TLS 1.2,部分新接口仅支持TLS 1.3
- 确认运行环境的.NET Framework版本:.NET Framework 4.0默认仅内置支持SSL 3.0、TLS 1.0,需要手动赋值枚举值才能支持更高版本TLS;.NET Framework 4.5及以上版本原生包含TLS 1.1、TLS 1.2的枚举定义
解决方案
你代码中ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;是核心错误代码,按你的运行环境修改即可:
.NET Framework 4.0 环境修复
.NET 4.0枚举未定义Tls11、Tls12,直接使用对应枚举值赋值:
public static Xmldata GetData(int productsPerPage, int pageNumber, RessourceType ressourceType) { // 跳过证书校验仅建议测试环境使用,生产环境请保留正规证书校验逻辑 System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; // 同时支持TLS 1.0、1.1、1.2,覆盖当前绝大多数接口的协议要求 ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072 | SecurityProtocolType.Tls; var request = new RestRequest(); request.RequestFormat = DataFormat.Xml; request.RootElement = "xmldata"; var client = new RestClient(); client.BaseUrl = baseUrl + "?data=" + ressourceType.ToString() + "&key=" + key + "&output=xml&RowspPage=" + productsPerPage + "&PageNumber=" + pageNumber + "&dataonly=true"; var response = client.Execute<Xmldata>(request); return response.Data; }
注:768对应TLS 1.1的枚举值,3072对应TLS 1.2的枚举值。
.NET Framework 4.5及以上环境修复
如果可升级项目的.NET版本,直接使用官方定义的枚举即可,可读性更高:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
额外注意事项
ServicePointManager是全局配置,建议将协议配置、证书校验回调逻辑放到程序启动入口处执行,不要每次请求都重复赋值,避免并发冲突- 生产环境不要全局跳过证书校验,测试结束后请移除
ServerCertificateValidationCallback返回true的逻辑,若使用自签证书建议单独做证书指纹比对校验 - 若修改后仍然报错,检查运行的Windows系统是否安装了TLS 1.2支持补丁,Windows Server 2008、Windows 7默认需要单独安装系统补丁才能支持TLS 1.2
内容的提问来源于stack exchange,提问作者user3369534
相关产品推荐
相关产品推荐

