Eu tenho uma chamada de serviço da web simples, gerada por um aplicativo do Windows .NET (C #) 2.0, por meio do proxy de serviço da web gerado pelo Visual Studio, para um serviço da Web também escrito em C # (2.0). Isso funcionou por vários anos e continua a fazê-lo em cerca de uma dúzia de locais onde está sendo executado.
Uma nova instalação em um novo site está com problemas. Ao tentar chamar o serviço da web, ele falha com a mensagem dizendo:
Não foi possível estabelecer uma relação de confiança para o canal seguro SSL / TLS
A URL do serviço da web usa SSL (https: //) - mas isso funciona há muito tempo (e continua a fazê-lo) em muitos outros locais.
Onde eu olho? Esse problema de segurança entre o Windows e o .NET pode ser exclusivo desta instalação? Em caso afirmativo, onde eu estabeleço relações de confiança? Estou perdido!
Respostas:
Pensamentos (baseados na dor do passado):
servidortem o relógio ajustado corretamente (ou seja, para que a hora UTC esteja correta [ignore a hora local, é em grande parte irrelevante]) - isso certamente é importante para o WCF, portanto pode afetar o SOAP normal?fonte
Os seguintes trechos corrigirão o caso em que há algo errado com o certificado SSL no servidor que você está chamando. Por exemplo, pode ser autoassinado ou o nome do host entre o certificado e o servidor pode não corresponder.
Isso é perigoso se você estiver chamando um servidor fora de seu controle direto, pois não poderá mais ter certeza de que está falando com o servidor ao qual pensa estar conectado. No entanto, se você estiver lidando com servidores internos e obter um certificado "correto" não for prático, use o seguinte para dizer ao serviço da Web que ignore os problemas de certificado e continue bravamente.
Os dois primeiros usam expressões lambda, o terceiro usa código regular. O primeiro aceita qualquer certificado. Os dois últimos, pelo menos, verificam se o nome do host no certificado é o que você espera.
... espero que você ache útil
fonte
ServicePointManager.ServerCertificateValidationCallback = null;
deve reverter para o comportamento padrão.A solução muito simples "pegar tudo" é esta:
A solução de sebastian-castaldi é um pouco mais detalhada.
fonte
#If CONFIG = "Debug"
instrução para que ele seja ativado somente no modo de depuração. Funciona muito bem!Pessoalmente, gosto mais da seguinte solução:
... antes de solicitar a obtenção do erro, faça o seguinte
Encontrei isso depois de consultar a Solução de Lucas
fonte
Se você estiver usando o Windows 2003, pode tentar o seguinte:
Referência: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...
fonte
Se você não deseja confiar cegamente em todos e criar uma exceção de confiança apenas para determinados hosts, a solução a seguir é mais apropriada.
Em seguida, basta ligar para Ssl.EnableTrustedHosts quando o aplicativo iniciar.
fonte
Luke escreveu um artigo muito bom sobre isso .. bastante direto .. faça uma tentativa
Solução de Lucas
Motivo (citação de seu artigo (menos xingamentos)) ".. O problema com o código acima é que ele não funciona se o seu certificado não for válido. Por que eu estaria postando em uma página da Web com um certificado SSL inválido? Sou barato e não estava com vontade de pagar à Verisign ou a uma das outras ** - * s por um certificado para minha caixa de teste, então eu o assinei.Quando enviei a solicitação, recebi uma exceção adorável:
System.Net.WebException A conexão subjacente foi fechada. Não foi possível estabelecer relação de confiança com o servidor remoto.
Eu não sei sobre você, mas para mim essa exceção parecia algo que seria causado por um erro bobo no meu código que estava causando a falha do POST. Então eu continuei pesquisando, aprimorando e fazendo todo tipo de coisas estranhas. Somente depois que pesquisei no *** n, descobri que o comportamento padrão após encontrar um certificado SSL inválido é lançar essa mesma exceção. .. "
fonte
A Ferramenta de diagnóstico SSL da Microsoft pode ajudar a identificar o problema.
ATUALIZAÇÃO o link foi corrigido agora.
fonte
Acabei de encontrar esse problema. Minha resolução foi atualizar a hora do sistema sincronizando manualmente com os servidores de hora. Para fazer isso, você pode:
Adjust Date/Time
Internet Time
guiaChange Settings
Update Now
No meu caso, isso estava sincronizando incorretamente, então tive que clicar nele várias vezes antes de atualizar corretamente. Se a atualização continuar incorreta, você pode tentar usar um servidor de horário diferente no menu suspenso do servidor.
fonte
Tente o seguinte:
Observe que você precisa trabalhar pelo menos com o 4.5 .NET framework
fonte
Eu tive um problema semelhante no
.NET
aplicativo no Internet Explorer.Resolvi o problema de adicionar o certificado (certificado VeriSign Classe 3 no meu caso) a certificados de editores confiáveis.
Você pode obter o certificado se exportá-lo de:
obrigado
fonte
Eu tive esse erro sendo executado em um servidor web com URL como:
mas não havia certificado para isso, então recebi um DNS chamado
Basta dar uma dica para essa solução aqui, pois ela apareceu no topo do google.
fonte
Para aqueles que estão enfrentando esse problema pelo lado do cliente VS, uma vez que adicionaram uma referência de serviço com êxito e tentaram executar a primeira chamada, receberam esta exceção: "A conexão subjacente foi fechada: não foi possível estabelecer relação de confiança para o canal seguro SSL / TLS" você está usando (como no meu caso) um URL de terminal com o endereço IP e recebeu essa exceção, provavelmente precisará adicionar novamente a referência de serviço, executando estas etapas:
Tente novamente :). obrigado
fonte
No meu caso, eu estava tentando testar o SSL no meu ambiente do Visual Studio usando o IIS 7.
Isto é o que acabei fazendo para fazê-lo funcionar:
No meu site, na seção 'Ligações ...' à direita no IIS, tive que adicionar a ligação 'https' à porta 443 e selecionar "Certificado de Desenvolvimento do IIS Express".
No meu site, na seção 'Configurações avançadas ...' à direita, tive que alterar os 'Protocolos ativados' de "http" para "https".
Sob o ícone 'Configurações SSL', selecione 'Aceitar' para certificados de cliente.
Então eu tive que reciclar o pool de aplicativos.
Eu também tive que importar o certificado de host local para minha loja pessoal usando o mmc.exe.
Meu
web.config
arquivo já estava configurado corretamente, então, depois de ter resolvido tudo o que foi dito acima, pude continuar meus testes.fonte
Minha solução (VB.Net, a versão "temporária" (UAT) desse aplicativo precisa trabalhar com o certificado "temporária", mas não afeta as solicitações quando elas estão no site ativo:
fonte
Se não funcionar com um certificado inválido, quando ServerCertificateValidationCallback retornar true; Código My ServerCertificateValidationCallback:
Meu código que impediu executar ServerCertificateValidationCallback:
Função OnValidateCertificateError:
Desabilitei o código CertificateValidation e ServerCertificateValidationCallback executando muito bem
fonte