Estou desenvolvendo um cliente TCP para conectar o servidor OpenSSL com a autenticação de certificado. Estou usando arquivos .crt e .key compartilhados pela equipe do servidor. Esses certificados são gerados por comandos OpenSSL.
Eu estou usando SslStream
objeto para autenticar o cliente Tcp chamando SslStream.AuthenticateAsClient
método passando servidor IP
, SslProtocols.Ssl3
e X509CertificateCollection
.
Eu estou recebendo o seguinte erro:
A autenticação falhou porque a parte remota fechou o fluxo de transporte
.net
openssl
x509certificate
sslstream
Odelu
fonte
fonte
SslProtocols.Ssl3
. Talvez você deva tentarSslProtocols.Tls
. No .Net 4.5 e superior, você também pode usarTls11
ouTls12
. Consulte SslProtocols Enumeration . Você pode ter outros problemas.Respostas:
Aconselho a não restringir o SecurityProtocol ao TLS 1.1.
A solução recomendada é usar
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls
Outra opção é adicionar a seguinte chave do Registro:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 Value: SchUseStrongCrypto
É importante notar que o .NET 4.6 usará o protocolo correto por padrão e não requer nenhuma das soluções.
fonte
System.Net.ServicePointManager.SecurityProtocol = ...
deve ser executado antes de criar a solicitação.Se você quiser usar uma versão mais antiga do .net, crie seu próprio sinalizador e lance-o.
// // 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); }
fonte
ServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Adicionar o código abaixo me ajudou a superar o problema.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
fonte
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); }
Isso funcionou para mim
fonte
Encontrei a mesma mensagem de erro ao usar o ChargifyNET.dll para me comunicar com a API Chargify. Adicionar
chargify.ProtocolType = SecurityProtocolType.Tls12;
à configuração resolveu o problema para mim.Aqui está o snippet de código completo:
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; }
fonte
Para VB.NET, você pode colocar o seguinte antes de sua solicitação da web:
Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols) Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType) ServicePointManager.SecurityProtocol = Tls12
Isso resolveu meu problema de segurança no .NET 3.5.
fonte
Isso aconteceu comigo quando um endpoint de solicitação da web foi alternado para outro servidor que aceitava apenas solicitações TLS1.2. Tentei tantas tentativas encontradas principalmente no Stackoverflow como
System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; para Global.ASX OnStart,
A exceção recebida não fez justiça ao problema real que eu estava enfrentando e não encontrou ajuda da operadora do serviço.
Para resolver isso, tenho que adicionar um novo Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 Eu usei a ferramenta IIS Crypto 2.0 daqui, conforme mostrado abaixo.
fonte