请求已中止:无法创建SSL / TLS安全通道

时间:2010-05-18 18:07:04

标签: c# asp.net windows-8 windows-7 httpwebrequest

由于此错误消息,我们无法使用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。这有什么改变吗?

48 个答案:

答案 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

另见How to enable Schannel event logging

答案 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)

另一种可能性是盒子上的证书输入不正确。确保选中环绕的复选框。最初我没有这样做,所以代码要么超时,要么抛出相同的异常,因为无法找到私钥。

certificate importation dialog

答案 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请求再次开始正常工作。基于我在其他地方的阅读,我学到了一些东西:

  • 这是您的appdomain中的全局设置,如果您有并发活动,则无法将其可靠地设置为一个值,执行操作,然后将其设置回来。另一个动作可能发生在那个小窗口期间并受到影响。
  • 正确设置是保留默认值。这允许.NET随着时间的推移继续使用任何最安全的默认值并升级框架。将它设置为TLS12(这是写作时最安全的)将现在,但在5年内可能会开始引起神秘问题。
  • 如果您确实需要设置值,则应考虑在单独的专用应用程序或应用程序域中执行此操作,并找到在它与主池之间进行通信的方法。因为它是一个单一的全局值,尝试在繁忙的应用程序池中管理它只会导致麻烦。这个答案:https://stackoverflow.com/a/26754917/7656通过自定义代理提供了一种可能的解决方案。 (注意我没有亲自实现它。)

答案 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值:

  • HKLM \ SOFTWARE \政策\微软\加密\配置\ SSL \ 00010002
  • HKLM \系统\ CurrentControlSet \控制\加密\配置\本地\ SSL \ 00010002

以下是我如何调查并解决了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;

之间选择
  • 使用SSL 2.0
  • 使用SSL 3.0
  • 使用TLS 1.0
  • 使用TLS 1.1
  • 使用TLS 1.2

enter image description here

答案 17 :(得分:5)

设置方法

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

似乎还可以,因为Tls1.2是安全协议的最新版本。但是我决定更深入地研究并回答我们是否真的需要对其进行硬编码。

规格:Windows Server 2012R2 x64。

从互联网上得知,默认情况下.NetFramework 4.6+必须使用Tls1.2。但是,当我将项目更新为4.6时,什么也没发生。 我发现一些信息,告诉我需要手动进行一些更改才能默认启用Tls1.2

https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

但是建议的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 Framework 4.5和更早版本-SSL 3.0,TLS 1.0
  • .NET Framework 4.6.x-TLS 1.0、1.1、1.2、1.3
  • .NET Framework 4.7+-系统(OS)默认值

(对于较旧的版本,根据系统上安装的.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)

在我的情况下,运行应用程序的服务帐户没有访问私钥的权限。一旦我获得此许可,错误便消失了

  1. MMC
  2. 证书
  3. 扩展为个人
  4. 选择证书
  5. 右键单击
  6. 所有任务
  7. 管理私钥
  8. 添加

答案 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错误。

https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

本质上,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 密码套件进行了加密和身份验证,可以与服务器握手。

enter image description here

我在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

enter image description here

答案 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