Não foi possível conectar-se a um servidor HTTPS usando WebRequest
devido a esta mensagem de erro:
The request was aborted: Could not create SSL/TLS secure channel.
Sabemos que o servidor não possui um certificado HTTPS válido com o caminho usado, mas para contornar esse problema, usamos o seguinte código que retiramos de outra postagem do StackOverflow:
private void Somewhere() {
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}
private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
return true;
}
O problema é que o servidor nunca valida o certificado e falha com o erro acima. Alguém tem alguma idéia do que devo fazer?
Devo mencionar que um colega e eu realizamos testes há algumas semanas e estava funcionando bem com algo semelhante ao que escrevi acima. A única "grande diferença" que encontramos é que estou usando o Windows 7 e ele estava usando o Windows XP. Isso muda alguma coisa?
The request was aborted: Could not create SSL/TLS secure channel
é muito genérico. Basicamente, "a inicialização da conexão SSL / TLS / HTTPS falhou por um dos muitos motivos possíveis". Portanto, se você obtê-lo regularmente em uma situação específica, sua melhor opção é fazer uma pergunta específica, fornecendo detalhes específicos sobre essa situação. E verificando o Visualizador de Eventos para obter mais informações. E / ou habilite a depuração do lado do cliente .NET para obter mais detalhes (o certificado do servidor não é confiável? Existe uma incompatibilidade de cifra? Incompatibilidade de versão do protocolo SSL / TLS etc.)Respostas:
Finalmente encontrei a resposta (não anotei minha fonte, mas era de uma pesquisa);
Enquanto o código funciona no Windows XP, no Windows 7, você deve adicioná-lo no início:
E agora, funciona perfeitamente.
TERMO ADITIVO
Como mencionado por Robin French; se você está tendo esse problema ao configurar o PayPal, observe que eles não suportam SSL3 a partir de 3 de dezembro de 2018. Você precisará usar o TLS. Aqui está a página Paypal sobre isso.
fonte
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
A solução para isso, no .NET 4.5 é
Se você não possui o .NET 4.5, use
fonte
ServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
Verifique se as configurações do ServicePointManager são feitas antes da criação do HttpWebRequest, caso contrário, não funcionará.
Trabalho:
Falha:
fonte
O problema que você está tendo é que o usuário aspNet não tem acesso ao certificado. Você precisa dar acesso usando o winhttpcertcfg.exe
Um exemplo de como configurar isso está em: http://support.microsoft.com/kb/901183
Na etapa 2 em mais informações
EDIT: nas versões mais recentes do IIS, esse recurso é incorporado à ferramenta do gerenciador de certificados - e pode ser acessado clicando com o botão direito do mouse no certificado e usando a opção para gerenciar chaves privadas. Mais detalhes aqui: /server/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
fonte
O erro é genérico e há muitos motivos pelos quais a negociação SSL / TLS pode falhar. O mais comum é um certificado de servidor inválido ou expirado, e você cuidou disso fornecendo seu próprio gancho de validação de certificado de servidor, mas não é necessariamente o único motivo. O servidor pode exigir autenticação mútua, pode ser configurado com um conjunto de cifras não suportadas pelo seu cliente, pode ter um desvio de tempo muito grande para que o handshake seja bem-sucedido e muitos outros motivos.
A melhor solução é usar o conjunto de ferramentas de solução de problemas do SChannel. O SChannel é o provedor SSPI responsável pelo SSL e TLS e seu cliente o utilizará para o handshake. Dê uma olhada nas Ferramentas e configurações TLS / SSL .
Consulte também Como habilitar o log de eventos do Schannel .
fonte
Schannel event logging
a do Windows 7-8-10 ?Eu tive esse problema ao tentar acessar https://ct.mob0.com/Styles/Fun.png , que é uma imagem distribuída pelo CloudFlare em sua CDN que suporta coisas loucas como SPDY e certificados SSL de redirecionamento estranho.
Em vez de especificar o Ssl3 como na resposta de Simons, eu era capaz de corrigi-lo descendo para o Tls12 assim:
fonte
Depois de muitas horas com esse mesmo problema, descobri que a conta do ASP.NET em que o serviço do cliente estava sendo executado não tinha acesso ao certificado. Eu o corrigi indo para o Pool de aplicativos IIS em que o aplicativo Web é executado, acessando Configurações avançadas e alterando a identidade para a
LocalSystem
contaNetworkService
.Uma solução melhor é fazer com que o certificado funcione com a
NetworkService
conta padrão , mas isso funciona para testes funcionais rápidos.fonte
A abordagem com a configuração
Parece estar bem, porque o Tls1.2 é a versão mais recente do protocolo seguro. Mas eu decidi olhar mais profundamente e responder se realmente precisamos codificá-lo.
Especificações: Windows Server 2012R2 x64.
Na internet, é dito que o .NetFramework 4.6+ deve usar o Tls1.2 por padrão. Mas quando atualizei meu projeto para 4.6, nada aconteceu. Encontrei algumas informações que indicam que preciso fazer manualmente algumas alterações para ativar o Tls1.2 por padrão
https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi
Mas a atualização proposta do Windows não funciona para a versão R2
Mas o que me ajudou foi adicionar 2 valores ao registro. Você pode usar o próximo script PS para que eles sejam adicionados automaticamente
Isso é o que eu estava procurando. Mas ainda não consigo responder à pergunta por que o NetFramework 4.6+ não define isso ... Valor do protocolo automaticamente?
fonte
Algo que a resposta original não tinha. Eu adicionei um pouco mais de código para torná-lo à prova de balas.
fonte
Tls and Tls11
são obsoletos ?SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes
Somente a opção válida seráServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
?Outra possibilidade é a importação incorreta de certificado na caixa. Certifique-se de marcar a caixa de seleção cercada. Inicialmente, eu não o fiz, então o código estava atingindo o tempo limite ou lançava a mesma exceção que a chave privada não pôde ser localizada.
fonte
A exceção "A solicitação foi interrompida: não foi possível criar canal seguro SSL / TLS" pode ocorrer se o servidor estiver retornando uma resposta HTTP 401 não autorizada à solicitação HTTP.
Você pode determinar se isso está acontecendo ativando o log System.Net em nível de rastreio para seu aplicativo cliente, conforme descrito nesta resposta .
Depois que essa configuração de log estiver em vigor, execute o aplicativo e reproduza o erro e procure na saída de log uma linha como esta:
Na minha situação, falhei ao definir um cookie específico que o servidor esperava, levando o servidor a responder à solicitação com o erro 401, o que levou à exceção "Não foi possível criar canal seguro SSL / TLS".
fonte
2 errors in 2 months
). Quando recebo o erro, alguns minutos depois, tento novamente manualmente e tudo está OK.Outra causa possível do
The request was aborted: Could not create SSL/TLS secure channel
erro é uma incompatibilidade entre os valores cipher_suites configurados do PC cliente e os valores que o servidor está configurado como disposto e capaz de aceitar . Nesse caso, quando seu cliente envia a lista de valores cipher_suites que ele pode aceitar na mensagem inicial "Cliente Olá" de handshaking / negociação SSL, o servidor vê que nenhum dos valores fornecidos é aceitável e pode retornar um "Alerta "em vez de prosseguir para a etapa" Server Hello "do handshake SSL.Para investigar essa possibilidade, você pode baixar o Microsoft Message Analyzer e usá-lo para executar um rastreamento na negociação SSL que ocorre quando você tenta e falha ao estabelecer uma conexão HTTPS com o servidor (no aplicativo C #).
Se você conseguir estabelecer uma conexão HTTPS bem-sucedida de outro ambiente (por exemplo, a máquina Windows XP que você mencionou - ou possivelmente pressionando a URL HTTPS em um navegador que não seja da Microsoft que não usa as configurações do conjunto de cifras do sistema operacional, como Chrome ou Firefox), execute outro rastreamento do Message Analyzer nesse ambiente para capturar o que acontece quando a negociação do SSL é bem-sucedida.
Felizmente, você verá alguma diferença entre as duas mensagens do Hello do cliente que permitirão identificar exatamente o que acontece com a falha na negociação SSL. Em seguida, você poderá fazer alterações na configuração do Windows que permitirão que ele seja bem-sucedido. O IISCrypto é uma ótima ferramenta para isso (mesmo para PCs clientes, apesar do nome "IIS").
As duas chaves de registro do Windows a seguir regem os valores cipher_suites que o seu PC usará:
Aqui está uma descrição completa de como eu investiguei e resolvi uma instância dessa variedade do
Could not create SSL/TLS secure channel
problema: http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.htmlfonte
A raiz dessa exceção no meu caso foi que, em algum momento do código, o seguinte estava sendo chamado:
Isso é muito ruim. Não apenas está instruindo o .NET a usar um protocolo não seguro, mas isso afeta todas as novas solicitações de WebClient (e similares) feitas posteriormente no domínio do aplicativo. (Observe que as solicitações da Web recebidas não são afetadas no aplicativo ASP.NET, mas novas solicitações do WebClient, como conversar com um serviço da Web externo, são).
No meu caso, ele não era realmente necessário, então eu poderia simplesmente excluir a declaração e todas as minhas outras solicitações da web começaram a funcionar bem novamente. Com base em minhas leituras em outros lugares, aprendi algumas coisas:
fonte
Eu tive esse problema porque meu web.config tinha:
e não:
fonte
Como você pode ver, existem muitas razões pelas quais isso pode acontecer. Pensei em adicionar a causa que encontrei ...
Se você definir o valor de
WebRequest.Timeout
como0
, esta é a exceção lançada. Abaixo está o código que eu tinha ... (Exceto em vez de um código embutido0
para o valor do tempo limite, eu tinha um parâmetro que foi inadvertidamente definido como0
).fonte
A resposta mais votada provavelmente será suficiente para a maioria das pessoas. No entanto, em algumas circunstâncias, você pode continuar recebendo o erro "Não foi possível criar canal seguro SSL / TLS" mesmo depois de forçar o TLS 1.2. Nesse caso, você pode consultar este artigo útilpara etapas adicionais de solução de problemas. Resumindo: independente do problema da versão TLS / SSL, o cliente e o servidor devem concordar com um "conjunto de criptografia". Durante a fase "handshake" da conexão SSL, o cliente listará seus conjuntos de cifras suportados para que o servidor verifique sua própria lista. Mas em algumas máquinas Windows, alguns conjuntos de cifras comuns podem ter sido desativados (aparentemente devido a tentativas bem-intencionadas de limitar a superfície de ataque), diminuindo a possibilidade de o cliente e o servidor concordarem com um conjunto de cifras. Se eles não concordarem, você poderá ver "código de alerta fatal 40" no visualizador de eventos e "Não foi possível criar canal seguro SSL / TLS" no seu programa .NET.
O artigo mencionado acima explica como listar todos os conjuntos de cifras potencialmente suportados de uma máquina e ativar conjuntos de cifras adicionais por meio do Registro do Windows. Para ajudar a verificar quais conjuntos de criptografia estão habilitados no cliente, tente visitar esta página de diagnóstico no MSIE. (O uso do rastreamento System.Net pode fornecer resultados mais definitivos.) Para verificar quais conjuntos de cifras são suportados pelo servidor, tente esta ferramenta online (supondo que o servidor seja acessível pela Internet). Não é necessário dizer que as edições do Registro devem ser feitas com cautela , especialmente nos casos em que a rede está envolvida. (Sua máquina é uma VM hospedada remota? Se você interromper a rede, a VM seria acessível?)
No caso da minha empresa, habilitamos vários pacotes "ECDHE_ECDSA" adicionais por meio da edição do Registro, para corrigir um problema imediato e proteger contra problemas futuros. Mas se você não pode (ou não deseja) editar o Registro, várias soluções alternativas (não necessariamente bonitas) vêm à mente. Por exemplo: seu programa .NET pode delegar seu tráfego SSL em um programa Python separado (que pode funcionar por si mesmo, pelo mesmo motivo que as solicitações do Chrome podem ser bem-sucedidas quando as solicitações do MSIE falham em uma máquina afetada).
fonte
Uma das maiores causas desse problema é a versão ativa do .NET Framework. A versão de tempo de execução do .NET framework afeta quais protocolos de segurança são ativados por padrão.
Não parece haver nenhuma documentação autorizada sobre como funciona especificamente em diferentes versões, mas parece que os padrões são determinados mais ou menos da seguinte maneira:
(Para versões mais antigas, sua milhagem pode variar um pouco com base em quais tempos de execução do .NET estão instalados no sistema. Por exemplo, pode haver uma situação em que você está usando uma estrutura muito antiga e o TLS 1.0 não é suportado ou o 4.6. x e TLS 1.3 não são suportados)
A documentação da Microsoft recomenda enfaticamente o uso do 4.7+ e os padrões do sistema:
Para sites ASP.NET , verifique a versão do .NET framework no seu
<httpRuntime>
elemento, pois isso determina qual tempo de execução é realmente usado pelo seu site:Melhor:
fonte
Este está trabalhando para mim no MVC webclient
fonte
Caso o cliente seja uma máquina Windows, um possível motivo pode ser que o protocolo tls ou ssl exigido pelo serviço não esteja ativado.
Isso pode ser definido em:
Role as configurações até "Segurança" e escolha entre
fonte
No meu caso, a conta de serviço executando o aplicativo não tinha permissão para acessar a chave privada. Depois de conceder essa permissão, o erro desapareceu
fonte
Se você estiver executando seu código no Visual Studio, tente executar o Visual Studio como administrador. Corrigido o problema para mim.
fonte
Eu lutei com esse problema o dia todo.
Quando criei um novo projeto com o .NET 4.5, finalmente o fiz funcionar.
Mas se eu fiz o downgrade para 4.0, tive o mesmo problema novamente e era irreversível para esse projeto (mesmo quando tentei atualizar para o 4.5 novamente).
Estranha nenhuma outra mensagem de erro, mas "A solicitação foi abortada: não foi possível criar o canal seguro SSL / TLS". surgiu para este erro
fonte
No nosso caso, usamos um fornecedor de software para não termos acesso para modificar o código .NET. Aparentemente, o .NET 4 não usará o TLS v 1.2, a menos que haja uma alteração.
A correção para nós foi adicionar a chave SchUseStrongCrypto ao registro. Você pode copiar / colar o código abaixo em um arquivo de texto com a extensão .reg e executá-lo. Serviu como nosso "patch" para o problema.
fonte
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tente o seguinte:
fonte
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
Isso corrigiu para mim, adicione o Serviço de Rede às permissões. Clique com o botão direito do mouse no certificado> Todas as tarefas> Gerenciar chaves privadas ...> Adicionar ...> Adicionar "Serviço de rede".
fonte
O problema para mim foi que eu estava tentando implantar no IIS como um serviço da Web, instalei o certificado no servidor, mas o usuário que executa o IIS não tinha as permissões corretas no certificado.
Como conceder ao ASP.NET acesso a uma chave privada em um certificado no armazenamento de certificados?
fonte
Eu estava tendo esse mesmo problema e achei que essa resposta funcionou corretamente para mim. A chave é 3072. Este link fornece os detalhes sobre a correção '3072'.
No meu caso, dois feeds exigiram a correção:
fonte
Esta pergunta pode ter muitas respostas, pois se trata de uma mensagem de erro genérica. Encontramos esse problema em alguns de nossos servidores, mas não em nossas máquinas de desenvolvimento. Depois de arrancar a maioria dos cabelos, descobrimos que era um bug da Microsoft.
https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect
Essencialmente, a MS assume que você deseja uma criptografia mais fraca, mas o sistema operacional está corrigido para permitir apenas o TLS 1.2, para que você receba o temido "A solicitação foi abortada: não foi possível criar o canal seguro SSL / TLS".
Existem três correções.
1) Aplique um patch ao sistema operacional com a atualização adequada: http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166
2) Adicione uma configuração ao seu arquivo app.config / web.config.
3) Adicione uma configuração de registro que já foi mencionada em outra resposta.
Tudo isso é mencionado no artigo da base de conhecimento que publiquei.
fonte
Outra possibilidade é que o código que está sendo executado não tenha as premissas necessárias.
No meu caso, recebi esse erro ao usar o depurador do Visual Studio para testar uma chamada para um serviço web. O Visual Studio não estava sendo executado como administrador, o que causou essa exceção.
fonte
Isso estava acontecendo para mim em apenas um site, e acontece que ele só tinha a cifra RC4 disponível. Em um esforço anterior para proteger o servidor, desabilitei a cifra RC4. Depois de reativá-la, o problema foi resolvido.
fonte