无法创建SSL / TLS安全通道。 SecureChannelFailure

时间:2018-07-11 14:43:47

标签: c# .net

使用SSL证书进行SOAP调用时出现SSL错误:

  

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

奇怪的是,如果我在Firefox中加载证书并访问端点或在不发送任何数据的情况下调用API,则不会收到任何错误消息,并且连接成功。公开API的公司还提到证书是犹太洁食。

我正在加载的证书具有“所有人”的全部特权。我已经尝试过在互联网上看到的所有解决方案,但仍然会收到错误消息。

这是我创建请求的代码:

 ServicePointManager.Expect100Continue = true;
 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
 var request = (HttpWebRequest)WebRequest.Create(plugin.EndPoint);
 request.ContentType = "text/xml; charset=utf-8";
 request.Method = "POST";

获得证书的代码(我也尝试过使用pfx):

var cert = new 
 509Certificate2(@"C:\clientcert.p12", "FakePassword");
request.ClientCertificates.Add(cert);

和请求代码:

  byte[] byteArray = Encoding.UTF8.GetBytes(xml);
    request.ContentLength = byteArray.Length;
    using (var dataStream = request.GetRequestStream())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    dataStream.Close();


                    using (WebResponse response = request.GetResponse())
                    {
                        using (var responseStream = response.GetResponseStream())
                        {
                            StreamReader reader = 
new StreamReader(responseStream ?? throw new InvalidOperationException());
                            return reader.ReadToEnd();
                        }
                    }

                }

编辑:

这是运行请求的跟踪输出:

  

System.Net信息:0:[11844]   InitializeSecurityContext(In-Buffers count = 2,Out-Buffer length = 0,   返回的代码= CertUnknown)。 System.Net错误:0:[11844]中的异常   HttpWebRequest#63832831 ::-请求被中止:无法创建   SSL / TLS安全通道。System.Net错误:0:[11844]中的异常   HttpWebRequest#63832831 :: EndGetRequestStream-请求为   已中止:无法创建SSL / TLS安全通道。

我还更改了SecurityProtocol:

ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

第二个编辑:我可以通过仅从SOAP UI中的文件系统加载SSL证书来使其在SoapUI中工作,但不能在.NET应用程序中工作。

3 个答案:

答案 0 :(得分:1)

出于兴趣,您的应用使用的是TLS 1.0、1.1和1.2协议,但是在Internet Explorer中启用了使用吗?

如果不在web.config中,请将其添加

<appSettings>
    <add key="SecurityProtocol" value="Tls12" />
</appSettings>

然后还在高级设置标签中的IE中检查它是否已启用:“使用TLS 1.2”

答案 1 :(得分:0)

您的SSL证书由Windows中未安装的根证书签名。

Firefox附带了自己的受信任的根证书列表,其中包含您正在使用的证书的根证书。仅仅因为Firefox信任证书并不意味着Windows信任它。

解决方案是在运行应用的计算机上安装证书的根证书或证书链。

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-temporary-certificates-for-use-during-development

如果这是一个具有广泛受众的应用程序,那么更简单的解决方案是切换到已经使用Windows附带的根证书的SSL提供程序。

答案 2 :(得分:0)

有时我也有此错误。我为克服此问题而采取的步骤如下:

  1. 从IIS导出证书
  2. 双击证书并按照向导进行操作
  3. 下一个存储位置“本地计算机”->
  4. 填写您在导出过程中选择的密码
  5. 选中将证书放置在商店中的选项,然后选择“受信任的根证书颁发机构”
  6. 完成->以检查导入是否成功,在“ Windows搜索”中键入“ certmgr.msc”,导航到“受信任的根证书颁发机构”,然后找到证书文件夹。应当存在导入的证书。
  7. 使用您的应用程序进行测试。

我希望对您有帮助