Ignore erros de certificado SSL inválido ao chamar serviços da web em .Net

87

Estamos configurando um novo SharePoint para o qual ainda não temos um certificado SSL válido. Eu gostaria de chamar o serviço da Web de listas nele para recuperar alguns metadados sobre a configuração. No entanto, quando tento fazer isso, recebo a exceção:

A conexão subjacente foi fechada: não foi possível estabelecer uma relação de confiança para o canal seguro SSL / TLS.

A exceção aninhada contém a mensagem de erro:

O certificado remoto é inválido de acordo com o procedimento de validação.

Correto, pois estamos usando um certificado temporário.

Minha pergunta é: como posso dizer ao cliente de serviço da Web .Net ( SoapHttpClientProtocol ) para ignorar esses erros?

jan.vdbergh
fonte

Respostas:

18

A abordagem que usei ao enfrentar esse problema foi adicionar o signatário do certificado temporário à lista de autoridades confiáveis ​​no computador em questão.

Eu normalmente faço testes com certificados criados com CACERT, e adicioná-los à minha lista de autoridades confiáveis ​​funcionou perfeitamente.

Fazer isso dessa maneira significa que você não precisa adicionar nenhum código personalizado ao seu aplicativo e simula corretamente o que acontecerá quando o seu aplicativo for implantado. Como tal, acho que esta é uma solução superior para desligar a verificação programaticamente.

Simon Johnson
fonte
Essa também foi minha primeira ideia. Infelizmente, o certificado também expirou, por isso é impossível torná-lo confiável.
jan.vdbergh
Existe alguma razão para você não poder usar alguém como o CA cert? Se for um certificado de teste, você pode simplesmente prosseguir com isso. Não tenho certeza se existe uma maneira de desativar essas verificações!
Simon Johnson,
113

Como alternativa, você pode registrar um delegado de retorno de chamada que ignora o erro de certificação:

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}
Alex Bagnolini
fonte
1
Eu adicionei este método estático ao global.asax e defini o evento no "OnApplicationStart". funcionou como um encanto. Obrigado
Juan Zamora
1
@JuanZamora Fiz a mesma coisa que você. Funcionou!
Sachin BR
5
Isso é tudo que você precisa fazer, se quiser ser vulnerável ao ataque do "Homem no Meio" ...
Houtman
2
Idealmente, você só deve fazer isso em um ambiente de desenvolvimento.
Ron DeFreitas
79

Como a resposta de Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Eu coloco isso no meu Main e olho para o meu app.confige teste se (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")antes de chamar aquela linha de código.

Keith Sirmons
fonte
24

Eu resolvi assim:

Chame o seguinte antes de chamar seu serviço da web SSL que causa o erro:

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}
Iman
fonte
11

Eu estava tendo o mesmo erro usando DownloadString; e conseguiu fazê-lo funcionar como abaixo com sugestões nesta página

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);
Dinesh Rajan
fonte
3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

irá ignorar o SSL invaild. Escreva para seu construtor de serviço da web.

Hasanaydogar
fonte
1

Para iniciantes, você pode estender sua classe de serviço parcial em um arquivo cs separado e adicionar o código fornecido por "imanabidi" para integrá-lo

Senthil
fonte
1

Para expandir ainda mais a postagem de Simon Johnsons - o ideal é que você queira uma solução que simule as condições que você verá na produção e modificar o seu código não fará isso e pode ser perigoso se você esquecer de retirar o código antes de implantá-lo.

Você precisará de algum tipo de certificado autoassinado. Se você estiver usando o IIS Express, você já terá um desses, basta encontrá-lo. Abra o Firefox ou qualquer navegador de sua preferência e vá para o site de desenvolvimento. Você deve conseguir visualizar as informações do certificado na barra de URL e, dependendo do seu navegador, poderá exportar o certificado para um arquivo.

Em seguida, abra MMC.exe e adicione o snap-in Certificado. Importe seu arquivo de certificado para o armazenamento de Autoridades de certificação de raiz confiável e isso é tudo de que você precisa. É importante certificar-se de que ele vai para aquela loja e não para alguma outra loja como 'Pessoal'. Se você não está familiarizado com MMC ou certificados, existem vários sites com informações sobre como fazer isso.

Agora, seu computador como um todo confiará implicitamente em qualquer certificado que ele mesmo gerou e você não precisará adicionar código para lidar com isso especialmente. Quando você passar para a produção, ele continuará a funcionar, desde que você tenha um certificado válido apropriado instalado lá. Não faça isso em um servidor de produção - isso seria ruim e não funcionará para nenhum outro cliente além dos do próprio servidor.

Nigel Thomas
fonte