无法创建 SSL/TLS 安全通道"http://www.rtvs.sk/televizia/archiv"



我对ssl/tls很陌生,所以请耐心等待。该代码对我来说适用于其他网站(例如iprima.cz(几个月,但对rtvs.sk不适用。它写道:无法创建SSL/TLS安全通道。我什么都试过了,但都不管用。请帮帮我。

string url1 = "https://www.rtvs.sk/televizia/archiv";
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
//It is because I have tried enerything
string rets = "";
using (WebClient wc = new WebClient())
{
wc.Proxy = null;
int i = 0;
zatry:
try
{
Stream stream = wc.OpenRead(url1);
Encoding kod = Encoding.UTF8;
StreamReader sr = new StreamReader(stream, kod);
rets = sr.ReadToEnd();
sr.Close();
}

在我看来,它是特定于站点的,它可以在Opera和其他浏览器上运行,但不能在我的代码上运行。这可能是一件简单的事情,但在审查了所有解决方案5个小时后,没有任何结果,我需要帮助。非常感谢

Microsoft.NET Framework 4.7.03062SP1Rel

它在Microsoft Visual Studio 2010和2019版本16.4.3 上有相同的错误

简介

看起来https://www.rtvs.sk/服务器使用了一种非标准的通信方式,这在.NET Framework库中是不受支持的。

服务器将任何HTTP连接重定向到HTTPS连接,这是无法避免的。

为了绕过";无法创建SSL/TLS安全通道";错误您需要使用不同的HTTPS客户端。我并不是说用WebRequest.Create代替WebClient。错误仍然存在,因为这是我在应用程序中使用的代码。通信错误可能是系统中更深层次的错误,因为即使是Internet Explorer也无法打开页面(至少在Windows 7中没有(。

备用客户端有几种可能的选择:

  1. 从头开始编写自己的客户端-我不能推荐这个解决方案,它很难,容易出错。。。

  2. 购买一个现有的替代客户端-我只为C#找到了一个替代HTTPS客户端,而且价格很高。对于我简单的个人应用程序来说太多了。

  3. 使用其他外部客户端,例如wget或其他下载程序(自定义和/或现有(。

  4. 尝试使用Linux(或Mono框架(中的应用程序。我没有测试这个解决方案,但(至少在理论上(这个问题可以通过这种方式解决。

我的解决方案

经过一个简单的测试,我发现使用Python下载时没有问题。所以我制作了一个简单的Python下载程序,并从我的C#应用程序中使用它。

C#中的代码是:

private const string PythonSciptPath = "PythonDownloader.py";
private static bool UseStandardDownloader(string address) =>
!address.StartsWith("https://www.rtvs.sk/", StringComparison.Ordinal);
private static byte[] GetData(string address)
{
var start = new ProcessStartInfo
{
FileName = "python.exe",
Arguments = PythonSciptPath + " "" + address + """,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
string result;
using (Process process = Process.Start(start))
using (StreamReader reader = process.StandardOutput)
{
result = reader.ReadToEnd();
}
return Convert.FromBase64String(result);
}

Python中的代码("PythonDownloader.py"文件(是:

import base64
import sys
import urllib.request
opener = urllib.request.URLopener()
stream = opener.open(sys.argv[1])
while True:
contentBytes = stream.read(60)
if len(contentBytes) == 0:
break
contentbase64Bytes = base64.b64encode(contentBytes)
contentString = contentbase64Bytes.decode("UTF-8")
print(contentString)

如何处理这个问题的一个简单方法是将文件添加到项目中,并选择";复制到输出目录";选择";如果更新则复制";。

当前的简单解决方案代码不处理任何错误。我把那部分留给你。

我也尝试过使用IronPython,但由于缺少库,我编写的简单客户端无法工作。它可能不会工作,因为它使用.NET Framework库作为解释器。

最新更新