ejemplo - C#HttpWebRequest La conexión subyacente se cerró: se produjo un error inesperado en un envío
webrequest post parameters c# (4)
Código para WebTestPlugIn
public class Protocols : WebTestPlugin
{
public override void PreRequest(object sender, PreRequestEventArgs e)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
}
}
He estado buscando en Google y probando todas las soluciones que pude encontrar o pensar en mí mismo. El sitio que estoy intentando cargar está ejecutando TLS1.2 al igual que algunos otros sitios con los que intenté probar para asegurarme de que no era un problema de TLS1.2. Los otros sitios cargados bien.
byte[] buffer = Encoding.ASCII.GetBytes(
"mod=www&ssl=1&dest=account_settings.ws"
+ "&username=" + username.Replace(" ", "20%")
+ "&password=" + password.Replace(" ", "20%"));
ServicePointManager.MaxServicePointIdleTime = 1000;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
HttpWebRequest WebReq =
(HttpWebRequest)WebRequest.Create(
"https://secure.runescape.com/m=weblogin/login.ws");
WebReq.Method = "POST";
WebReq.KeepAlive = false;
WebReq.Referer =
"https://secure.runescape.com/m=weblogin/loginform.ws"
+ "?mod=www&ssl=1&expired=0&dest=account_settings.ws";
WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
reply = _Answer.ReadToEnd();
curAccount++;
if (reply.Contains("Login Successful"))
{
eturn true;
}
else
{
eturn false;
}
No importa lo que intente, sigo recibiendo la excepción.
La conexión subyacente se cerró: se produjo un error inesperado en un envío.
Bajo más detalles encontré
La autenticación falló porque la parte remota ha cerrado el flujo de transporte.
En la versión 4.0 del marco .Net, ServicePointManager.SecurityProtocol
solo ofrecía dos opciones para configurar:
- Ssl3: protocolo de seguridad Secure Socket Layer (SSL) 3.0.
- Tls: Protocolo de seguridad de la capa de transporte (TLS) 1.0
En la próxima versión del marco, el enumerador SecurityProtocolType
se extendió con los nuevos protocolos Tls, por lo que si su aplicación puede usar la versión 4.5 también puede usar:
- Tls11: especifica el protocolo de seguridad 1.1 de Seguridad de la capa de transporte (TLS)
- Tls12: especifica el protocolo de seguridad de la Seguridad de la capa de transporte (TLS) 1.2.
Así que si estás en .Net 4.5 cambia tu línea
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
a
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
de modo que el ServicePointManager creará secuencias compatibles con las conexiones Tls12.
Tenga en cuenta que los valores de enumeración se pueden usar como indicadores para que pueda combinar varios protocolos con un OR lógico
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls12;
Nota
Trate de mantener el número de protocolos que admita lo más bajo posible y actualizado con los estándares de seguridad actuales. Ssll3 ya no se considera seguro y el uso de Tls1.0 SecurityProtocolType.Tls
está en declive.
Experimenté esta excepción, y también estaba relacionada con ServicePointManager.SecurityProtocol
.
Para mí, esto se debía a que ServicePointManager.SecurityProtocol
había establecido en Tls | Tls11
Tls | Tls11
(debido a ciertos sitios web que visita la aplicación con TLS 1.2 dañado) y al visitar un sitio web solo para TLS 1.2 (probado con el Informe SSL de SSLLabs ), falló.
Una opción para .NET 4.5 y superior es habilitar todas las versiones de TLS:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12;
Para el uso de .Net 4:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;