我正在开发一个TCP客户端,以使用证书身份验证连接OpenSSL服务器。我使用服务器团队共享的.crt和.key文件。这些证书由OpenSSL命令生成。
我使用的SslStream
对象调用来验证TCP客户端SslStream.AuthenticateAsClient
通过将服务器的方法IP
,SslProtocols.Ssl3
和X509CertificateCollection
。
我收到以下错误:
验证失败,因为远程方已关闭传输流
我正在开发一个TCP客户端,以使用证书身份验证连接OpenSSL服务器。我使用服务器团队共享的.crt和.key文件。这些证书由OpenSSL命令生成。
我使用的SslStream
对象调用来验证TCP客户端SslStream.AuthenticateAsClient
通过将服务器的方法IP
,SslProtocols.Ssl3
和X509CertificateCollection
。
我收到以下错误:
验证失败,因为远程方已关闭传输流
Answers:
我建议不要将SecurityProtocol限制为TLS 1.1。
推荐的解决方案是使用
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
另一个选择是添加以下注册表项:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
值得注意的是,.NET 4.6默认情况下将使用正确的协议,并且不需要任何一种解决方案。
System.Net.ServicePointManager.SecurityProtocol = ...
必须在创建请求之前执行。
如果要使用旧版本的.net,请创建自己的标志并将其强制转换。
//
// Summary:
// Specifies the security protocols that are supported by the Schannel security
// package.
[Flags]
private enum MySecurityProtocolType
{
//
// Summary:
// Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
Ssl3 = 48,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.0 security protocol.
Tls = 192,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.1 security protocol.
Tls11 = 768,
//
// Summary:
// Specifies the Transport Layer Security (TLS) 1.2 security protocol.
Tls12 = 3072
}
public Session()
{
System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
}
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
using (var client = new HttpClient(handler))
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}
这对我有用
使用ChargifyNET.dll与Chargify API通信时,我遇到了相同的错误消息。添加chargify.ProtocolType = SecurityProtocolType.Tls12;
到配置为我解决了这个问题。
这是完整的代码片段:
public ChargifyConnect GetChargifyConnect()
{
var chargify = new ChargifyConnect();
chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];
// Without this an error will be thrown.
chargify.ProtocolType = SecurityProtocolType.Tls12;
return chargify;
}
当Web请求端点切换到仅接受TLS1.2请求的另一台服务器时,这发生在我身上。尝试了很多尝试,这些尝试主要在Stackoverflow上找到,例如
收到的例外情况并不能使我所面对的实际问题变得公道,并没有获得服务运营商的帮助。
为了解决这个问题,我必须添加一个新的Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 我从这里开始使用IIS Crypto 2.0 Tool,如下所示。
SslProtocols.Ssl3
。也许你应该尝试一下SslProtocols.Tls
。在.Net 4.5及更高版本中,您也可以使用Tls11
或Tls12
。请参阅SslProtocols枚举。您可能还有其他问题。