使用HttpWebRequest请求https链接时,无法访问的问题,设置ServicePointManager.SecurityProtocol安全协议

本文介绍了在C# .NET 4.0环境下,使用HttpWebRequest访问HTTPS链接遇到问题时,如何通过设置ServicePointManager.SecurityProtocol为TLS1.2来解决因不支持高级加密协议导致的访问失败问题。
//请求前设置一下使用的安全协议类型 System.Net
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)){
    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) =>
    {
       return true; //总是接受  
    });
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
}
namespace System.Net
{
    [System.Flags]
    public enum SecurityProtocolType
    {
       Ssl3 = 48,
       Tls = 192,
       Tls11 = 768,
       Tls12 = 3072,
    }
}

c# .net 4.0 HttpWebRequest 访问https TLS1.2 解决方案

    public static string DoRequest(string Url, string cookieStr)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);

            request.Timeout = 1000 *900;

            request.Headers.Add(HttpRequestHeader.Cookie, cookieStr);

            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36";

            ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2;

            string back ="";
            try {
                        WebResponse response = request.GetResponse();
                        StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
                         back = reader.ReadToEnd();
                        reader.Close();
                        reader.Dispose();
                        response.Close();
            }
            catch(Exception ex){

                back = ex.Message;
            }



            return back;
        }

 

<think>首先,用户的问题是关于解决电脑上的错误:"CheckTime:System.NotSupportedException: The requested security protocol is not supported."。核心是System.NotSupportedException,意思是请求安全协议不被支持。这在.NET环境中常见,通常与SSL/TLS协议版本相关。 用户提供了两个引用: - 引用[1]:关于维护一个列表,提交拉取请求或开issue来更新信息。 - 引用[2]:关于重命名项目和数据库后出现HTTP 500错误,需要修改XML文件。 这些引用似乎不直接相关到用户的问题。用户说“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 所以,我应该忽略这些引用,专注于当前的错误。 用户的问题是:“我想解决电脑出现 'CheckTime:System.NotSupportedException: The requested security protocol is not supported.' 错误的方法”。这是一个具体的技术问题。 关键点是: - 错误是System.NotSupportedException。 - 消息是“The requested security protocol is not supported”。 - 这通常发生在.NET应用程序中,当代码尝试使用一个不被支持的安全协议,比如旧版本的SSL或TLS。 常见原因: - 应用程序指定了特定的安全协议(如Ssl3、Tls、Tls11、Tls12),但该系统不支持该协议。 - 在.NET Framework中,默认的安全协议设置可能不包括所需的协议。 - 系统可能缺乏必要的更新来支持某些协议。 解决方案: 1. 更新.NET Framework:确保安装了最新版本的.NET Framework,因为旧版本可能不支持较新的协议。 2. 设置安全协议在代码中:在应用程序启动设置ServicePointManager.SecurityProtocol属性以包括所需的协议。 3. 操作系统更新:确保Windows是更新的,因为协议支持依赖于操作系统。 4. 检查应用程序配置文件:有可以在app.config或web.config中设置安全协议。 5. 诊断工具:使用网络工具检查协议支持。 用户提到了“CheckTime”,这可能是一个应用程序名或模块名,但我不知道具体是什么。我应该假设这是一个.NET应用程序引发的错误。 步骤式解决: - 首先,确认错误环境:是.NET应用程序吗?是开发环境还是生产环境? - 然后,尝试设置SecurityProtocol。 通用解决步骤: 1. 在代码中添加:在Main方法或应用程序启动添加: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 这强制使用TLS 1.2、1.1或1.0。 2. 如果错误发生在现有代码,检查是否有硬编码的安全协议设置。 3. 更新系统和.NET Framework。 4. 如果是在IIS或Web服务器上,检查服务器配置。 既然用户说“电脑出现”,可能是桌面应用程序或命令行工具。 在回答中: - 使用中文,因为指令要求。 - 结构清晰:解释错误原因,给出步骤解决方案。 - 添加相关问题,因为指令要求生成相关问题。 - 确保LaTeX语法正确:如果有数学表达式,使用$...$或$$...$$,但这个问题可能不需要数学。 - 引用标识:如果有引用,添加[^n],但这里没有外部引用。用户提供的引用不相关,所以忽略。 用户上一次的问题:在历史中,用户之前的问题是关于重命名项目和数据库的错误,但当前问题是新的。所以,参考用户的问题,直接解决。 最终回答结构: 1. 解释错误:简要说明错误原因。 2. 提供解决方案步骤:列出具体方法。 3. 添加相关问题:生成2-3个相关问题。 相关问题想法: - 如何更新.NET Framework来解决安全协议错误? - SecurityProtocolType枚举有哪些选项? - 如何诊断SSL/TLS协议支持问题? 确保回答真实可靠:基于标准.NET开发知识。 </think>### 解决 "System.NotSupportedException: The requested security protocol is not supported" 错误的方法 这个错误通常发生在.NET Framework应用程序中,当代码尝试使用一个不被当前系统或.NET环境支持的安全协议(如SSL或TLS版本)。常见原因包括: - 应用程序指定了一个过或不兼容的安全协议(如SSL 3.0或TLS 1.0)。 - .NET Framework版本过旧,不支持较新的协议(如TLS 1.2)。 - 操作系统缺乏必要的更新。 - 代码中硬编码了特定的协议设置,但系统环境不允许。 以下是逐步解决方案。请先确认错误发生的环境(如开发IDE、命令行工具或部署服务器),然后依次尝试这些方法。如果问题发生在特定应用程序(如您提到的 "CheckTime" 模块),请确保有源代码访问权限。 #### 步骤1: 更新 .NET Framework 和操作系统 - **为什么需要**:旧版.NET Framework默认不支持较新的安全协议。Windows更新可以添加协议支持。 - **操作步骤**: 1. 打开Windows更新设置:在Windows搜索栏输入 "Windows Update" 并运行。 2. 点击 "检查更新",安装所有可用更新(尤其是.NET Framework累积更新)。 3. 确保.NET Framework版本至少为4.6或更高(TLS 1.2在4.6+中默认支持)。检查方法: - 打开命令提示符(cmd),输入: ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release ``` - 如果Release值小于394802(对应.NET 4.6.2),请从[Microsoft官网下载最新.NET Framework](https://dotnet.microsoft.com/download/dotnet-framework)。 4. 重启电脑后测试错误是否解决。 - **注意事项**:如果您的应用程序依赖特定框架版本,请确保兼容性。 #### 步骤2: 在代码中显式设置安全协议 - **为什么需要**:.NET应用程序可能需要手动指定支持的协议,避免依赖系统默认设置。 - **操作步骤**(适用于有源代码访问的情况): 1. 在应用程序的启动代码(如`Main`方法或`Application_Start`事件)中添加以下行: ```csharp using System.Net; // 确保引入System.Net命名空间 // 设置支持的安全协议,推荐使用TLS 1.2或更高 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; ``` 如果需要兼容旧系统,可以添加多个协议: ```csharp ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ``` 2. 重新编译并运行应用程序。如果您使用配置文件(如app.config或web.config),也可以在`<system.web>`节添加: ```xml <system.web> <httpRuntime targetFramework="4.7.2" /> <!-- 指定目标框架版本 --> </system.web> ``` 或在`<runtime>`节中设置协议: ```xml <runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" /> </runtime> ``` 3. 测试应用程序是否正常工作。 - **注意事项**:避免使用协议如`Ssl3`,因为它不安全。优先使用`Tls12`或`Tls13`。 #### 步骤3: 检查系统协议支持和环境变量 - **为什么需要**:Windows可能禁用了某些协议,或环境变量导致冲突。 - **操作步骤**: 1. 检查系统支持的协议列表: - 运行命令提示符为管理员,输入: ```bash reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols /s ``` - 查看输出,确保所需的协议(如TLS 1.2)未被禁用(DisabledByDefault=0)。 2. 如果协议被禁用,启用它: - 打开注册表编辑器(regedit),导航到: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client` - 设置`Enabled`值为1(若不存在则创建DWORD值)。 - 同样检查`Server`路径。 - 重启电脑。 3. 检查环境变量:确保没有变量(如`SSL_CERT_FILE`)覆盖协议设置。 - 在系统属性 > 高级 > 环境变量中检查。 - **注意事项**:修改注册表有风险,建议备份注册表或创建系统还原点。 #### 步骤4: 诊断和测试 - 如果以上无效,使用工具诊断: - **网络诊断**:运行Wireshark或Fiddler抓包,检查实际使用的协议。 - **代码调试**:在抛出异常的代码附近添加日志输出当前`ServicePointManager.SecurityProtocol`值。 - **简化测试**:创建一个简单的.NET控制台应用测试连接: ```csharp using System; using System.Net; class Program { static void Main() { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://example.com"); request.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Console.WriteLine("Success: " + response.StatusCode); } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } } } ``` 运行此代码查看是否重现错误。 #### 常见失败原因和备选方案 - **如果错误发生在第三方应用**:联系应用开发者报告issue,或检查文档是否要求特定.NET版本。 - **如果使用旧系统(如Windows 7)**:升级到Windows 10或更高,因为旧OS对TLS 1.2+支持有限。 - **备选方案**:如果不能修改代码,尝试使用兼容模式运行应用程序(右键exe > 属性 > 兼容性选项卡)。 如果问题持续,提供更多细节(如.NET版本、Windows版本和错误堆栈跟踪)以便进一步分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值