基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。C#:WinForm进行HTTP请求正常,同样的请求放到WinService就报错

本文解决了一个在Windows服务(WinService)中进行HTTPS请求时遇到的证书验证错误,通过自定义证书验证方法并设置ServicePointManager的ServerCertificateValidationCallback属性,实现了忽略证书错误,使请求能够正常进行。

C#:WinForm进行HTTP请求正常,同样的请求放到WinService就报错:基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

1:解决方案:
//引入命名空间
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

2:

/// <summary>
        /// 证书验证方法,总是返回true
        /// </summary>
        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {   // 总是接受  
            return true;
        }

 

3:HTTP请求前调用验证方法

public static Stream PostUrlForStream(string url, string param, PostEnum postEnum, string inputCharset = "utf-8")
        {
            try
            {
                //HTTP请求前调用验证方法,强制验证通过
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);//验证服务器证书回调自动验证
            }
            catch(Exception ex) {
            }
            return null;
        }

 

参考:https://www.cnblogs.com/sufei/archive/2010/03/23/1692811.html

问题应该是出在证书验证上,这么做相当于让证书验证变得无效,目前我还没有找到其他更好的方法.

### 原因分析 在C#中发起请求出现“请求被中止: 未能创建 SSL/TLS 安全通道错误通常与SSL/TLS协议版本不兼容、证书问题或服务器端配置更改有关。以下是具体原因: 1. **SSL/TLS协议版本不兼容**:如果客户端使用的SSL/TLS协议版本与服务器端不兼容,会导致无法建立安全连接。例如,某些旧系统默认使用较老的协议版本(如TLS 1.0),而服务器可能已升级到仅支持TLS 1.2或更高版本[^4]。 2. **证书问题**:证书过期、未正确安装或不受信任的证书颁发机构(CA)可能导致连接失败。例如,微信支付的根证书更换后,如果未及更新相关证书,可能会导致此类错误[^2]。 3. **服务器端配置更改**:第三方服务提供方可能对服务器的安全配置进行了调整,例如禁用了某些不再推荐使用的加密套件或协议版本,导致客户端无法正常连接[^1]。 4. **操作系统和.NET Framework版本限制**:不同版本的Windows和.NET Framework支持的SSL/TLS协议版本不同。例如,Windows Server 2003默认不支持TLS 1.2,除非手动启用[^3]。 ### 解决方案 针对上述原因,可以采取以下措施来解决“请求被中止: 未能创建 SSL/TLS 安全通道错误: 1. **强制使用TLS 1.2或更高版本** 在代码中显式设置`ServicePointManager.SecurityProtocol`以确保使用最新的TLS协议版本。建议使用TLS 1.2或更高版本,因为这些版本提供了更强的安全性和兼容性。 ```csharp System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ``` 如果需要兼容旧系统,可以同启用多个协议版本: ```csharp System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ``` 这种方式可以确保客户端尝试使用所有可用的协议版本进行连接,从而提高兼容性[^4]。 2. **更新和安装必要的证书** 确保所有相关的CA证书和API证书都已正确安装,并且是最新的版本。特别是对于微信支付等服务,务必按照官方文档的要求安装最新的根证书和中间证书[^2]。 3. **检查服务器端配置** 如果可能,联系第三方服务提供方确认其服务器的安全配置,包括支持的SSL/TLS协议版本和加密套件。确保客户端配置与服务器端兼容。 4. **升级操作系统和.NET Framework** 对于老旧的操作系统(如Windows Server 2003),建议升级到更新的版本(如Windows Server 2016或更高),以获得更好的安全性和协议支持。同,确保.NET Framework版本为4.6或更高,以便默认支持TLS 1.2[^3]。 5. **调试和日志记录** 在代码中添加详细的日志记录,捕获请求过程中的异常信息,帮助定位问题。可以使用`try-catch`块捕获`WebException`并检查响应流中的详细错误信息。 ```csharp try { // 发起请求的代码 } catch (WebException ex) { using (var response = (HttpWebResponse)ex.Response) { Console.WriteLine($"Status Code: {response?.StatusCode}"); Console.WriteLine($"Status Description: {response?.StatusDescription}"); } } ``` 通过以上方法,可以有效解决C#中发起HTTPS请求出现的“请求被中止: 未能创建 SSL/TLS 安全通道错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值