Pergunta

Oi eu estou encontrando problemas ao tentar publicar um WebRequest sob HTTPS.

i recebeu os seguintes erros

1.-A conexão subjacente foi fechada: Não é possível se conectar ao servidor remoto

.

2.-a operação TimeOut

3-A conexão subjacente foi fechada: não foi possível estabelecer canal seguro para SSL / TLS

.

Eu tentei com cerca de 3 ou 4 diferentes proxies da minha empresa e a empresa cliente e nem mesmo quando estou diretamente com o provedor ISP sem restrições, eu recebo os erros acima ao executar o método a seguir

WebRequest.GetRequestStream() 

isso ocorre atrás de um proxy ou não, o pedido só pode ser sucesso pós partir de um único PC que está atrás de um proxy. o proxy não tem um certificado de cliente instalado.

este está sob NET Framework 1.1 e o pedido já contém as credenciais de rede.

o que poderia ser?

Atualização

a exceção interna do 3º erro é o seguinte: A função foi concluída com êxito, mas deve ser chamado novamente para concluir o contexto

de acordo com iisper.h este erro pertence a

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

MSDN esta refere-se a

SEC_I_CONTINUE_NEEDED O cliente deve enviar a saída token para o servidor e espera por um sinal de retorno. O token retornado é então passada em outra chamada para InitializeSecurityContext (Schannel). O token de saída pode estar vazio.

faz isso significa que o PC carece de um certificado de cliente?

Foi útil?

Solução

Há uma série de coisas que poderiam ser complicando as coisas, tanto quanto inconsistências com os certificados SSL, etc. Mas, primeiro, você deve fazer alguma depuração básica para descartar as coisas óbvias:

- Você tentou enviar um pedido web simples para outros servidores? Tente ambos (unsecured) http e (seguro) https

- Você tentou se conectar de outro computador, ou de outra rede? Você mencionou que o cliente está atrás de um proxy; tente um computador w / o de um proxy primeiro lugar, para descartar essa possibilidade.

- Você está fazendo vários WebRequests dentro da sessão? Há um hard-limite para o número de solicitações de abertura, para se certificar que você está fechando-los depois que você começa a WebResponse. Talvez fazer um programa de teste com apenas um pedido.

Se isso não reduzi-lo, então provavelmente é algo mais complicado, com o seu servidor ou o proxy. Você pode rastrear pacotes de rede de saída com um programa como o netshark para tentar rastrear onde as coisas estão ficando preso.

Outras dicas

Você poderia fazer um traço de tráfego HTTP utilizando Fiddler ou uma ferramenta de pacotes de rede sniffing como Ethereal Whireshark na máquina onde ele está trabalhando, e em um dos outros máquinas, e comparar os resultados. Isto é bastante baixo nível, mas pode lançar alguma luz sobre a questão.

  • Se você pode telnet a partir de diferentes máquinas para 443, então não é os dois primeiros, como isso significa que a máquina cliente está recebendo pedidos nessa porta.

No windows que seria

telnet <domainname> 443

e se conecta a tela fica em branco (hit voltar algumas vezes para sair)

  • Os proxies podem ou não realmente se preocupam com o seu pedido se estiver sob o HTTPS como eles não podem lê-lo.

  • fazer as outras máquinas têm o certificado do cliente e da cadeia de certificados instalado?

O nome do certificado SSL provavelmente não corresponde. Este é frequentemente o caso com certificados selfsigned.

A solução é escrever sua própria rotina de autenticação onde você quer sempre retornar true ou fazer a autenticação necessária para garantir que o certificado é válido.

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top