Pregunta

Hola, me encuentro con problemas al intentar publicar una solicitud web en Https.

recibí los siguientes errores

1.-La conexión subyacente se cerró: no se puede conectar al servidor remoto.

2.-la operación TimeOut

3-La conexión subyacente se cerró: no se pudo establecer un canal seguro para SSL / TLS.

Intenté con aproximadamente 3 o 4 proxies diferentes de mi empresa y la empresa del cliente y ni siquiera cuando estoy directamente con el proveedor de ISP sin restricciones, obtengo los errores anteriores al ejecutar el siguiente método

WebRequest.GetRequestStream() 

esto ocurre detrás de un proxy o no, la solicitud solo se puede publicar con éxito desde una sola PC que está detrás de un proxy. el proxy no tiene un certificado de cliente instalado.

esto está bajo .net framework 1.1 y la solicitud ya contiene credenciales de red.

¿Qué podría ser?

Actualizar

la excepción interna el 3er error es el siguiente:  La función se completó correctamente, pero se debe volver a llamar para completar el contexto

según iisper.h documentación a este error pertenece a la

//
// 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)

en MSDN esto se refiere a

SEC_I_CONTINUE_NEEDED  El cliente debe enviar el token de salida al servidor y esperar un token de retorno. El token devuelto se pasa en otra llamada a InitializeSecurityContext (Schannel). El token de salida puede estar vacío.

¿esto significa que la PC carece de un certificado de cliente?

¿Fue útil?

Solución

Hay una gran cantidad de cosas que podrían estar complicando las cosas, en cuanto a inconsistencias con los certificados SSL, etc. Pero primero, debe hacer una depuración básica para descartar las cosas obvias:

- ¿Intentó enviar una simple solicitud web a otros servidores? Pruebe tanto http (no seguro) como https (seguro)

- ¿Intentaste conectarte desde otra computadora o desde otra red? Usted mencionó que el cliente está detrás de un proxy; pruebe una computadora sin un proxy primero, para descartarlo.

- ¿Está haciendo múltiples WebRequests dentro de la sesión? Hay un límite estricto en la cantidad de solicitudes abiertas, así que asegúrese de cerrarlas después de obtener la Respuesta web. Quizás haga un programa de prueba con solo una solicitud.

Si eso no lo reduce, entonces probablemente sea algo más complicado, con su servidor o el proxy. Puede rastrear paquetes de red salientes con un programa como netshark para tratar de rastrear dónde se estancan las cosas.

Otros consejos

Puede rastrear el tráfico HTTP utilizando Fiddler o una herramienta de rastreo de paquetes de red como Ethereal Whireshark en la máquina donde funciona y en una de las otras máquinas, y comparar los resultados. Esto es bastante bajo, pero podría arrojar algo de luz sobre el problema.

  • Si puede hacer telnet desde diferentes máquinas al 443, entonces no son las dos primeras, ya que eso significa que la máquina del cliente está recibiendo solicitudes en ese puerto.

En ventanas que serían

telnet <domainname> 443

y si se conecta, la pantalla quedará en blanco (presione regresar varias veces para salir)

  • Los proxies pueden o no preocuparse realmente por su solicitud si está bajo HTTPS ya que no pueden leerla.

  • ¿Las otras máquinas tienen instalado el certificado del cliente y la cadena de certificados?

El nombre del certificado SSL probablemente no coincida. Este suele ser el caso de los certificados autofirmados.

La solución es escribir su propia rutina de autenticación donde siempre devuelve verdadero o realiza la autenticación necesaria para asegurarse de que el certificado sea 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top