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;
}
Run Code Online (Sandbox Code Playgroud)
问题是服务器永远不会验证证书并因上述错误而失败.有谁知道我该怎么办?
我应该提到一位同事和我几周前进行了测试,并且它与我上面写的内容类似.我们发现的唯一"主要差异"是我使用的是Windows 7并且他使用的是Windows XP.这有什么改变吗?
问题:我得到这个异常"的基础连接已关闭:意外错误发生在一个发送"我的日志,它是在随机时间打破了我们的OEM集成与我们的电子邮件营销系统从不同[1小时 - 4小时]
我的网站托管在带有IIS 7.5.7600的Windows Server 2008 R2上.该网站拥有大量的OEM组件和全面的仪表板.除了我们在仪表板中用作iframe解决方案的电子邮件营销组件之外,网站的所有其他元素都可以正常工作.它的工作方式是,我发送一个httpWebRequestobject与所有凭据,我得到一个网址,我把它放在一个iframe,它的工作原理.但它仅适用于一段时间[1 HOUR - 4小时],然后我得到下面的异常"的基础连接已关闭:意外错误发生在一个发送"即使系统尝试从HttpWebRequest的它获取URL失败,同样的例外.使其再次工作的唯一方法是回收应用程序池或在web.config中编辑任何内容.我真的很精疲力尽所有我能想到的选择.
明确添加, keep-alive = false
keep-alive = true
增加时间: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
我已将此页面上传到非SSL网站,以检查我们的生产服务器上的SSL证书是否正在建立连接以放弃一些方法.
非常感谢任何解决方向.
代码:
Public Function CreateHttpRequestJson(ByVal url) As String
Try
Dim result As String = String.Empty
Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest)
httpWebRequest.ContentType = "text/json"
httpWebRequest.Method = "PUT"
httpWebRequest.ContentType = "application/x-www-form-urlencoded"
httpWebRequest.KeepAlive = False
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
'TODO change the integratorID to the serviceproviders account Id, useremail
Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
Dim json As …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序使用HTTPS POST将数据发送到服务器.我使用System.Net.WebClient对象来执行此操作.这是一个发送一些数据的函数:
private byte[] PostNameValuePairs(string uri, NameValueCollection pairs)
{
byte[] response;
String responsestring = "";
using (WebClient client = new WebClient())
{
client.Headers = GetAuthenticationHeader();
string DataSent = GetNameValueCollectionValuesString(pairs);
try
{
response = client.UploadValues(uri, pairs);
responsestring = Encoding.ASCII.GetString(response);
}
catch (Exception e)
{
responsestring = "CONNECTION ERROR: " + e.Message;
return Encoding.ASCII.GetBytes(responsestring);
}
finally
{
_communicationLogger.LogCommunication(uri, client.Headers.ToString(), DataSent, responsestring);
}
}
return response;
}
Run Code Online (Sandbox Code Playgroud)
我们传入一个以https://开头的URI
这已经很长时间了.今天,我们开始收到以下连接错误:"基础连接已关闭:发送时发生意外错误".我们对服务器的所有者进行了一些故障排除,他们最终将其缩小到以下内容.他们对服务器进行了更改以阻止TLS 1.0,并表示我们现在需要使用TLS 1.1或1.2发送数据.
我需要在我的WebClient对象(或我的函数中的其他位置)中设置什么才能使用TLS 1.1或1.2而不是TLS 1.0?
我们正在使用.NET Framework 4.5,如果这有所作为.
我们的.net WCF客户端,WebRequest调用,编译到运行在Win2012-R2上的Windows EXE,拒绝连接到仅面向TLS 1.2的Web服务器
我们知道Win2012和.NET 4.5x支持TLS 1.2
当服务器表面TLS 1.0及更高版本时,我们没有问题.只有当我们连接的服务器具有DISABLED TLS 1.0,1.1和SSL2以及SSL3时才会出现此问题.Server ONLY表面TLS 1.2.Chrome和firefox(在Win 7及更高版本上)可以很好地连接到服务器(没有任何警告或SSL问题).
服务器证书是%100 OK.
问题是WebRequest在这种情况下无法连接.
我们需要在代码中设置什么,以便我们使用WebRequest将连接到可能运行TLS 1.2,1.1,1.0和/或SSL v3的系统?
在c#中,我能够为SSL3或TLS设置静态值,例如
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Run Code Online (Sandbox Code Playgroud)
要么:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)
但是(我相信)这将影响我的应用程序中所有未来的HttpWebRequest对象.
有没有办法为给定的HttpWebRequest或至少为给定的URI设置此值?
注意我看到了这个:
Uri uri = new Uri(url);
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
Run Code Online (Sandbox Code Playgroud)
但ServicePoint没有SecurityProtocol属性.
目前我认为我必须在创建新的HttpWebRequest之前设置静态全局属性.
这感觉不对,这也意味着:
我的应用程序必须通过https与不同的主机通信,默认设置为ServicePointManager.SecurityProtocol = TLS
我提供了很好的服务.现在我有一些主机(如System.Net
跟踪日志显示)不回答初始TLS握手消息,但保持底层连接打开,直到超时,抛出超时异常.我尝试将HttpWebRequest
超时设置为5分钟,结果相同.据推测,这些主机正在等待SSL3握手,因为IE和Firefox都可以在30-40秒的延迟后连接到这些主机.在.NET中似乎有一些回退机制将TLS降级为SSL3,但由于某些原因它没有启动.
FWIW,这是我的请求发送的握手消息(常规TLS 1.0 CLIENT HELLO消息):
00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 …
Run Code Online (Sandbox Code Playgroud)