C# 关于“您与该网站的连接不是私密连接...”的问题
目录
问题现象
范例运行环境
WebService 类
类介绍
增加参数
实现
小结
问题现象
最近在访问开发的微信支付功能时遇到了无法访问令牌的错误,这个错误是公司内部应用程序接口返回的访问错误。经过排查是访问 HTTPS 站点遇到的错误,提示证书风险,在浏览器中显示的调用 URL,显示结果如下图:
如图如果点击 “忽略警告,继续访问” 则可以跳过安全检测,但在 c# 程序隐式的调用 api url 来获取返回结果,就会遇到证书风险错误,而无法继续访问。本文将介绍关于此问题的一些解决方法。
范例运行环境
操作系统: Windows Server 2019 DataCenter
.net版本: .netFramework4.0 或以上
开发工具:VS2019 C#
WebService 类
类介绍
WebService 类提供了访问 Web API Url 的能力,方法获取 API 返回的处理结果字串。关于WebService 类请参阅我的文章《C# 实现访问 Web API Url 提交数据并获取处理结果》。
增加参数
对 WebService 类的GetResponseResult方法增加了参数, 使用说明见如下表格:
序号 | 参数名 | 类型 | 说明 |
---|---|---|---|
1 | secValid | bool | 是否进行安全协议认证,默认值为 true |
实现
关键实现代码如下:
public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData,string[] headers,string ContentType= "application/x-www-form-urlencoded",bool secValid=true)
{
method = method.ToUpper();
if (secValid == false)
{
ServicePointManager.ServerCertificateValidationCallback = validSecurity;
}
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
当 secValid 为 false 的时候,增加了一个 validSecurity 方法。 该方法应用于 ServicePointManager.ServerCertificateValidationCallback,该属性是一个委托属性,它允许你指定一个回调方法,当需要验证服务器SSL证书时,可以自定义验证逻辑。
该方法实现代码如下:
private static bool validSecurity(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
小结
该方法只是为紧急解决问题的一种被动方式,事因情况紧急,访问的地址又是可信任的地址,因此是一种临时的解决方案,仅供应用参考,当安全证书恢复更新后,我们还是需要采取要求安全协议验证的方式来访问。
关于 System.Net.ServicePointManager.SecurityProtocol 的更多介绍请访问如下链接:
https://learn.microsoft.com/zh-cn/dotnet/api/system.net.securityprotocoltype?view=net-5.0
其它一些相关阅读可访问如下链接:
https://support.microsoft.com/zh-cn/topic/%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8D%87%E7%BA%A7%E5%88%B0-net-framework-4-6-%E5%90%8E%E4%BD%BF%E7%94%A8-servicepointmanager-%E6%88%96-sslstream-api-1e3a9788-ab0d-7794-204b-6c4678bc5ed5
本文代码仅供您参考使用,感谢您的阅读,希望本文能够对您有所帮助。