由于此错误消息,我们无法使用WebRequest
连接到HTTPS服务器:
The request was aborted: Could not create SSL/TLS secure channel.
我们知道服务器没有使用路径的有效HTTPS证书,但为了绕过此问题,我们使用以下代码,我们从另一个StackOverflow帖子中获取:
private void Somewhere() {
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}
private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
return true;
}
问题是服务器从不验证证书,并因上述错误而失败。有谁知道我该怎么办?
我应该提到一位同事和我几周前进行了测试,并且它与我上面写的内容类似。我们发现的唯一“主要差异”是我使用的是Windows 7并且他使用的是Windows XP。这有什么改变吗?
答案 0 :(得分:418)
我终于找到了答案(我没有注意到我的来源,但这是来自搜索);
虽然代码适用于Windows XP,但在Windows 7中,您必须在开头添加:
// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons
现在,它完美无缺。
<强>附录强>
正如罗宾法国人所说;如果您在配置PayPal时遇到此问题,请注意,从2018年12月开始,他们不支持SSL3。您需要使用TLS。这是关于它的Paypal page。
答案 1 :(得分:85)
.NET 4.5中的解决方案是
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
如果您没有.NET 4.5,请使用
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
答案 2 :(得分:53)
确保在创建HttpWebRequest之前已对ServicePointManager进行设置,否则它将无法正常工作。
作品:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")
失败:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
答案 3 :(得分:31)
您遇到的问题是aspNet用户无权访问证书。您必须使用winhttpcertcfg.exe
授予访问权限有关如何进行此设置的示例如下: http://support.microsoft.com/kb/901183
在更多信息的第2步中
编辑:在更新版本的IIS中,此功能内置于证书管理器工具中 - 可以通过右键单击证书并使用管理私钥的选项来访问。更多详情:https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
答案 4 :(得分:25)
错误是通用的,并且SSL / TLS协商可能失败的原因有很多。最常见的是无效或过期的服务器证书,您通过提供自己的服务器证书验证挂钩来解决这个问题,但不一定是唯一的原因。服务器可能需要相互身份验证,它可能配置了客户端不支持的密码套件,它可能有一个时间漂移太大,握手成功和更多的原因。
最佳解决方案是使用SChannel故障排除工具集。 SChannel是负责SSL和TLS的SSPI提供程序,您的客户端将使用它进行握手。看看TLS/SSL Tools and Settings。
答案 5 :(得分:24)
我试图点击https://ct.mob0.com/Styles/Fun.png时出现此问题,这是由CloudFlare在其CDN上分发的图像,支持疯狂的东西,如SPDY和奇怪的重定向SSL证书。
而不是像在Simons中那样指定Ssl3,我可以通过这样下去Tls12来修复它:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");
答案 6 :(得分:17)
经过多长时间的同样问题后,我发现客户端服务运行的ASP.NET帐户无法访问证书。我通过进入运行Web应用程序的IIS应用程序池,进入高级设置,并将标识从LocalSystem
更改为NetworkService
帐户来修复它。
更好的解决方案是让证书使用默认的NetworkService
帐户,但这适用于快速功能测试。
答案 7 :(得分:14)
原始答案没有的东西。我添加了一些代码以使其成为防弹。
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
答案 8 :(得分:13)
另一种可能性是盒子上的证书输入不正确。确保选中环绕的复选框。最初我没有这样做,所以代码要么超时,要么抛出相同的异常,因为无法找到私钥。
答案 9 :(得分:9)
这个在MVC webclient中为我工作
<div id="register" class="modal" role="dialog">
<button type="button" class="close" data-dismiss="modal">
<img class="svg" src="<?php echo base_url(); ?>assets/images/modal-close.svg">
</button>
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Register With Us</h4>
</div>
<div class="modal-body">
//here is my form
</div>
</div>
</div>
</div>
答案 10 :(得分:9)
如果服务器返回对HTTP请求的 HTTP 401 Unauthorized 响应,则“请求已中止:无法创建SSL / TLS安全通道”异常可能会发生异常。
您可以通过启用客户端应用程序的跟踪级System.Net日志记录来确定是否发生这种情况,如this answer中所述。
一旦该日志记录配置到位,运行应用程序并重现错误,然后在日志记录输出中查找如下所示的行:
System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.
在我的情况下,我没有设置服务器期望的特定cookie,导致服务器响应401错误的请求,这反过来导致“无法创建SSL / TLS安全通道”异常。
答案 11 :(得分:8)
这样做对我有帮助:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
答案 12 :(得分:8)
在我的案例中,这个异常的根源是在代码的某个时刻调用了以下内容:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
这真的很糟糕。它不仅指示.NET使用不安全的协议,而且这会影响您的appdomain中随后发出的每个新WebClient(和类似)请求。 (请注意,传入的Web请求不会受到ASP.NET应用程序的影响,但新的WebClient请求(例如与外部Web服务通信)是。)
在我的情况下,它实际上并不需要,所以我可以删除该语句,我的所有其他Web请求再次开始正常工作。基于我在其他地方的阅读,我学到了一些东西:
答案 13 :(得分:7)
正如您所知,这可能有很多原因。以为我会添加我遇到的原因......
如果将WebRequest.Timeout
的值设置为0
,则抛出该异常。下面是我的代码...(除了超时值的硬编码0
,我有一个参数,无意中设置为0
)。
WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...
答案 14 :(得分:6)
我整天都在努力解决这个问题。
当我使用.NET 4.5创建一个新项目时,我终于开始工作了。
但如果我降级到4.0,我又遇到了同样的问题,这个项目是不可逆转的(即使我试图再次升级到4.5)。
奇怪没有其他错误消息,但“请求已中止:无法创建SSL / TLS安全通道。”出现此错误
答案 15 :(得分:6)
The request was aborted: Could not create SSL/TLS secure channel
错误的另一个可能原因是客户端PC配置的cipher_suites值与服务器配置为愿意并且能够接受的值不匹配。在这种情况下,当您的客户端在其初始SSL握手/协商“客户端Hello”消息中发送它能够接受的cipher_suites值列表时,服务器会发现所提供的值都不可接受,并且可能返回“警报” “响应而不是继续进行SSL握手的”服务器Hello“步骤。
要研究这种可能性,您可以下载Microsoft Message Analyzer,并使用它来运行SSL协商时的跟踪,当您尝试无法与服务器建立HTTPS连接时(在C#应用中)。
如果您能够从其他环境(例如您提到的Windows XP计算机)成功建立HTTPS连接,或者可能通过在不使用操作系统密码套件设置的非Microsoft浏览器中访问HTTPS URL ,例如Chrome或Firefox),在该环境中运行另一个Message Analyzer跟踪,以捕获SSL协商成功时发生的情况。
希望您会看到两个Client Hello消息之间的某些区别,这些消息可以让您准确查明失败的SSL协商导致其失败的原因。然后,您应该能够对Windows进行配置更改,以使其成功。 IISCrypto是一个很好用的工具(即使对于客户端PC,尽管有“IIS”名称)。
以下两个Windows注册表项管理您的PC将使用的cipher_suites值:
以下是我如何调查并解决了Could not create SSL/TLS secure channel
这类问题的实例的完整文章:http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html
答案 16 :(得分:6)
如果客户端是Windows机器,可能的原因可能是服务所需的tls或ssl协议未被激活。
可在以下位置设置:
控制面板 - &gt;网络和互联网 - &gt;互联网选项 - &gt;先进
将设置滚动到&#34;安全&#34;
之间选择答案 17 :(得分:5)
设置方法
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
似乎还可以,因为Tls1.2是安全协议的最新版本。但是我决定更深入地研究并回答我们是否真的需要对其进行硬编码。
规格:Windows Server 2012R2 x64。
从互联网上得知,默认情况下.NetFramework 4.6+必须使用Tls1.2。但是,当我将项目更新为4.6时,什么也没发生。 我发现一些信息,告诉我需要手动进行一些更改才能默认启用Tls1.2
但是建议的Windows更新不适用于R2版本
但是帮助我的是将2个值添加到注册表中。您可以使用下一个PS脚本,以便将它们自动添加
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
这就是我想要的。但是我仍然不能回答为什么NetFramework 4.6+不会自动设置此... Protocol值的问题?
答案 18 :(得分:5)
我遇到了这个问题,因为我的web.config有:
<httpRuntime targetFramework="4.5.2" />
而不是:
<httpRuntime targetFramework="4.6.1" />
答案 19 :(得分:4)
另一种可能性是正在执行的代码没有要求的权限。
就我而言,使用Visual Studio调试器测试对Web服务的调用时出现此错误。 Visual Studio不是以管理员身份运行,这导致了此异常。
答案 20 :(得分:4)
如果从Visual Studio运行代码,请尝试以管理员身份运行Visual Studio。解决了我的问题。
答案 21 :(得分:3)
此问题的最大原因之一是活动的.NET Framework版本。 .NET Framework运行时版本会影响默认情况下启用的安全协议。
似乎没有关于它在不同版本中的具体工作方式的权威文档,但是似乎默认值或多或少地确定如下:
(对于较旧的版本,根据系统上安装的.NET运行时,您的里程可能会有所不同。例如,可能会出现以下情况:您使用的是非常旧的框架,并且不支持TLS 1.0;或者使用4.6.x和TLS 1.3不支持)
Microsoft's documentation强烈建议使用4.7+和系统默认值:
我们建议您:
- 在您的应用上定位.NET Framework 4.7或更高版本。在WCF应用程序上定位目标.NET Framework 4.7.1或更高版本。
- 不指定TLS版本。配置代码,让操作系统决定TLS版本。
- 进行全面的代码审核,以确认您未指定TLS或SSL版本。
对于ASP.NET网站,请检查<httpRuntime>
元素中的.NET框架版本,因为这将确定您的站点实际使用的运行时:
<httpRuntime targetFramework="4.5" />
更好:
<httpRuntime targetFramework="4.7" />
答案 22 :(得分:3)
我遇到了同样的问题,发现this answer对我有用。关键是3072. This link提供有关&#39; 3072&#39;的详细信息。固定。
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);
在我的情况下,两个Feed需要修复:
https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss
答案 23 :(得分:3)
终于为我找到了解决方案。
在调用 https url 之前尝试添加以下行(对于 .Net framework 4.5):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
答案 24 :(得分:3)
在我的情况下,运行应用程序的服务帐户没有访问私钥的权限。一旦我获得此许可,错误便消失了
答案 25 :(得分:3)
System.Net.WebException:请求被中止:无法创建 SSL / TLS安全通道。
在我们的案例中,我们在使用软件供应商,因此我们无权修改.NET代码。除非有更改,否则.NET 4显然不会使用TLS v 1.2。
对我们来说,解决方法是将SchUseStrongCrypto密钥添加到注册表中。您可以将以下代码复制/粘贴到扩展名为.reg的文本文件中并执行它。它是我们解决该问题的“补丁”。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
答案 26 :(得分:2)
我的问题是我尝试在IIS上部署为Web服务,我在服务器上安装了证书,但运行IIS的用户对证书没有正确的权限。
How to give ASP.NET access to a private key in a certificate in the certificate store?
答案 27 :(得分:2)
此问题可能有很多答案,因为它与一般错误消息有关。我们在某些服务器上遇到了此问题,但在我们的开发机器上却没有遇到。拔掉大部分头发后,我们发现这是一个Microsoft错误。
本质上,MS假定您希望使用较弱的加密,但是操作系统已打补丁以仅允许TLS 1.2,因此您收到可怕的“请求已中止:无法创建SSL / TLS安全通道。”
有三个修复程序。
1)用正确的更新修补操作系统:http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166
2)将设置添加到您的app.config / web.config文件中。
3)添加另一个答案中已经提到的注册表设置。
所有这些都在我发布的知识库文章中提到。
答案 28 :(得分:2)
尝试一下:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
答案 29 :(得分:1)
这个答案都对我不起作用,谷歌浏览器和邮递员可以和服务器握手,但是和.net不起作用。在Google Chrome浏览器的“安全性”标签>“连接”中显示,使用 ECDHE_RSA和P-256和AES_256_GCM 密码套件进行了加密和身份验证,可以与服务器握手。
我在Windows Server 2012 R2的密码套件列表中安装了IIS Crypto,但找不到带有P-256和AES_256_GCM 密码套件的ECDHE_RSA。然后我将Windows更新到最新版本,但问题无法解决。最终,经过搜索,我了解到Windows Server 2012 R2不正确支持GSM,并将服务器更新为Windows Server 2016,问题解决了。
答案 30 :(得分:1)
这只是在一个网站上发生的,事实证明它只有RC4密码可用。在先前强化服务器的努力中,我已经禁用了RC4密码,一旦我重新启用它,问题就解决了。
答案 31 :(得分:1)
我遇到了通过命令行应用程序将视频上传到Wistia的问题。我们的系统管理员通过使用IIScrypto列出的IIScrypto启用其他密码套件来解决了该问题,该套件在SSL实验扫描中列出了upload.wistia.com
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x9e)DH 2048位FS 128 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x9f)DH 2048位FS 256
答案 32 :(得分:1)
只要这是一个相对“实时”的链接,我想我会添加一个新选项。由于Poodle攻击的问题,该服务可能不再支持SSL 3.0。查看关于此的Google声明。我立刻遇到了几个Web服务的问题,并意识到必须要进行一些事情。我切换到TLS 1.2,一切都恢复了。
http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html
答案 33 :(得分:1)
对于 SOAP/WCF 用户,当服务器拒绝您的 WS-Security 配置时,也会发生此错误。客户端收到的错误信息非常模糊,但服务器管理员很可能能够确定原因。
一个例子是在 UsernameToken Profile 下,该消息被认为在 <wsu:Created>
时间过期不是有效的 ISO 8601 日期时间,要么是由于格式错误、不是 UTC 或服务器时间不匹配.
<wsse:UsernameToken wsu:Id="Example-1">
<wsse:Username> ... </wsse:Username>
<wsse:Password Type="..."> ... </wsse:Password>
<wsse:Nonce EncodingType="..."> ... </wsse:Nonce>
<wsu:Created>2021-01-31T19:00:00.0000000Z</wsu:Created>
</wsse:UsernameToken>
答案 34 :(得分:1)
除上述答案外,请确保已将CER证书,而非PFX文件导入本地计算机商店。有这两个文件时常见的错误。
答案 35 :(得分:1)
这对我来说是固定的,将网络服务添加到权限。 右键单击证书&gt;所有任务&gt;管理私钥&gt;添加&gt;网络服务
答案 36 :(得分:1)
你可以尝试安装一个演示证书(一些ssl提供商免费提供一个月),以确定问题是否与证书有效性有关。
答案 37 :(得分:1)
在我的情况下,当Windows服务尝试连接到Web服务时,我遇到了这个问题。最后查看Windows事件我发现了一个错误代码。
事件ID 36888(Schannel)被提出:
The following fatal alert was generated: 40. The internal error state is 808.
最后,它与Windows Hotfix有关。就我而言:KB3172605和KB3177186
vmware论坛中提出的解决方案是在Windows中添加一个注册表项。添加以下注册表后,一切正常。
[HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \控制\ SecurityProviders \ SCHANNEL \ KeyExchangeAlgorithms \的Diffie-Hellman]
“ClientMinKeyBitLength”= DWORD:00000200
显然,它与客户端https握手中的缺失值有关。
列出您的Windows HotFix:
wmic qfe list
解决方案线程:
https://communities.vmware.com/message/2604912#2604912
希望它有所帮助。
答案 38 :(得分:1)
上面的大多数答案都提到了会话算法或密钥交换算法。
在我的情况下,两者都没有问题,但问题在于服务器的证书哈希算法,该算法未在客户端的 PC 上启用。
我想出了在我的应用程序配置中添加一个部分的方法。
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net">
<listeners>
<add name="System.Net" />
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="System.Net" />
</listeners>
</source>
<source name="System.Net.Cache">
<listeners>
<add name="System.Net" />
</listeners>
</source>
</sources>
<sharedListeners>
<add
name="System.Net"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="System.Net.trace.log"
/>
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
<add name="System.Net.Sockets" value="Verbose" />
<add name="System.Net.Cache" value="Verbose" />
</switches>
</system.diagnostics>
然后日志中的错误导致我到了这个 solution
答案 39 :(得分:0)
从注册表中删除此选项对我在 Windows Server 2012 中有所帮助 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangAlgorithms
答案 40 :(得分:0)
我在Windows 2008 Server的.NET 4.5.2 Winform应用程序上遇到了相同的错误。
我尝试了以下修复程序:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls1|SecurityProtocolType.Tls11| SecurityProtocolType.Tls12;
但是那没有用,并且错误发生的次数仍然存在。
按照上面的答案之一,是否必须重写SchUseStrongCrypto注册表项。如果设置此键,是否有任何副作用。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
答案 41 :(得分:0)
我在商店和文件中都有证书。我尝试连接文件并收到此错误消息。当我在商店中使用一个时,它就可以工作。我最好的猜测是,当我想使用文件上的证书时,由于存储了该证书而引起了某种冲突。 (同一台机器上的另一项服务使用了商店中的证书,而我使用文件中的证书开发了另一项服务。在测试之前,它一直像开发人员的魅力一样工作。)
答案 42 :(得分:0)
令人惊讶的是,即使项目运行正常,在几次更新数据库后,突然停止工作,并且从ssms中删除数据库后,命令Update-Database -Force
不再起作用!
我重新启动了Visual Studio,手动创建了数据库,一次又一次地进行了迁移,修改了连接字符串,没有任何反应!
毕竟,我想出了将项目设置为 Startup Project 的方法,然后一切又恢复了!
答案 43 :(得分:0)
top-voted answer对于大多数人来说可能就足够了。但是,在某些情况下,即使强制实施TLS 1.2,也可能继续出现“无法创建SSL / TLS安全通道”错误。如果是这样,您可能需要咨询this helpful article以获得其他故障排除步骤。总结:与TLS / SSL版本问题无关,客户端和服务器必须在“密码套件”上达成共识。在SSL连接的“握手”阶段,客户端将列出其支持的密码套件,以供服务器根据自己的列表进行检查。但是在某些Windows机器上,某些通用密码套件可能已被禁用(似乎是由于故意限制攻击面的企图),从而降低了客户端和服务器就密码套件达成协议的可能性。如果他们不同意,那么您可能会在事件查看器中看到“致命警报代码40”,并在.NET程序中看到“无法创建SSL / TLS安全通道”。
上述文章介绍了如何列出计算机可能支持的所有密码套件,以及如何通过Windows注册表启用其他密码套件。为了帮助检查客户端上启用了哪些密码套件,请尝试访问MSIE中的this diagnostic page。 (使用System.Net跟踪可能会提供更多确定的结果。)要检查服务器支持哪些密码套件,请尝试this online tool(假设服务器可以通过Internet访问)。不用说,注册表编辑必须谨慎,尤其是在涉及网络的地方。 (您的计算机是远程托管的VM吗?如果您要中断网络连接,该VM完全可以访问吗?)
就我公司而言,我们通过注册表编辑器启用了多个其他的“ ECDHE_ECDSA”套件,以解决眼前的问题并防范将来的问题。但是,如果您不能(或不会)编辑注册表,那么就会想到许多变通办法(不一定漂亮)。例如:您的.NET程序可以将其SSL流量委派给一个单独的Python程序(由于受影响的计算机上的MSIE请求失败而Chrome请求可能成功的原因,它本身可能会起作用)。
答案 44 :(得分:0)
没有一个答案对我有用。
这是可行的:
与其像这样初始化我的X509Certifiacte2
:
var certificate = new X509Certificate2(bytes, pass);
我是这样做的:
var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
通知 X509KeyStorageFlags.Exportable
!
我没有更改其余代码(WebRequest
本身):
// I'm not even sure the first two lines are necessary:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", server));
request.Method = "GET";
request.Referer = string.Format("https://hercules.sii.cl/cgi_AUT2000/autInicio.cgi?referencia=https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", servidor);
request.UserAgent = "Mozilla/4.0";
request.ClientCertificates.Add(certificate);
request.CookieContainer = new CookieContainer();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// etc...
}
事实上,我什至不确定前两行是否必要...
答案 45 :(得分:0)
如果您不想,不能轻松地或无法快速修补代码,则可以通过框架中的.NET代码强制使用TLS 1.2。
这不是我的应用程序,但是它帮助修复了较旧的.NET 4.5应用程序(在Server 2008r2上运行),使其可以再次与Paypal Payflow Gateway一起使用。他们必须已经开始在6/25/18和7/8/18之间的付费流网关回调上强制通过TLS 1.2进行连接。
详细信息:https://github.com/TheLevelUp/pos-tls-patcher 下载:https://github.com/TheLevelUp/pos-tls-patcher/releases
答案 46 :(得分:0)
我最近遇到了同样的问题。我的环境在带有VB.NET的.NET 4.6.1下运行。我就是这样修复的:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf util.ValidateServerCertificate)
和util.ValidateServerCertificate函数是:
Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return True
End Function
答案 47 :(得分:0)
默认的.NET ServicePointManager.SecurityProtocol
使用SSLv3和TLS。如果您正在访问Apache服务器,则会有一个名为SSLProtocol
的配置变量,默认为TLSv1.2。您可以将ServicePointManager.SecurityProtocol
设置为使用Web服务器支持的相应协议,也可以更改Apache配置以允许所有协议SSLProtocol
all
。