Estoy tratando de encontrar una manera de ignorar la verificación del certificado cuando solicito un recurso Https, hasta ahora, encontré algún artículo útil en Internet.
Pero todavía tengo algún problema. Por favor revise mi código. Simplemente no entiendo qué significa el código ServicePointManager.ServerCertificateValidationCallback
.
¿Cuándo se llamará a este método delegado? Y una pregunta más, ¿en qué lugar debo escribir este código? Antes de ServicePointManager.ServerCertificateValidationCallback
ejecutar o antes Stream stream = request.GetRequestStream()
?
public HttpWebRequest GetRequest()
{
CookieContainer cookieContainer = new CookieContainer();
// Create a request to the server
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);
#region Set request parameters
request.Method = _context.Request.HttpMethod;
request.UserAgent = _context.Request.UserAgent;
request.KeepAlive = true;
request.CookieContainer = cookieContainer;
request.PreAuthenticate = true;
request.AllowAutoRedirect = false;
#endregion
// For POST, write the post data extracted from the incoming request
if (request.Method == "POST")
{
Stream clientStream = _context.Request.InputStream;
request.ContentType = _context.Request.ContentType;
request.ContentLength = clientStream.Length;
ServicePointManager.ServerCertificateValidationCallback = delegate(
Object obj, X509Certificate certificate, X509Chain chain,
SslPolicyErrors errors)
{
return (true);
};
Stream stream = request.GetRequestStream();
....
}
....
return request;
}
}
c#
ssl
httpwebrequest
certificate
Joe.wang
fuente
fuente
Respuestas:
Como solo hay un ServicePointManager global , la configuración de ServicePointManager.ServerCertificateValidationCallback generará el resultado de que todas las solicitudes posteriores heredarán esta política. Dado que es una "configuración" global, se preferiría establecerla en el método Application_Start en Global.asax .
La configuración de la devolución de llamada anula el comportamiento predeterminado y usted mismo puede crear una rutina de validación personalizada.
fuente
HttpWebRequest
. Si está utilizando cualquier otro medio, tendrá que buscar en la documentación cómo lograr esto.Para cualquier persona interesada en aplicar esta solución por solicitud, esta es una opción y utiliza una expresión Lambda. La misma expresión de Lambda se puede aplicar al filtro global mencionado por blak3r también. Este método parece requerir .NET 4.5.
En .NET 4.0, la expresión Lambda se puede aplicar al filtro global como tal
fuente
true
es algo que puede hacer al experimentar durante el desarrollo, sin embargo, es inseguro. Debería ser un condicional.(HttpWebRequest)WebRequest.Create(url)
es perfectamente válido, pero en mi caja,HttpWebRequest.Create(url)
todavía existe en un proyecto dirigido a .Net 4.6.2. La elección del chef, pero en este puntoHttpClient
es probablemente la mejor API para usar.Esto funcionó para mí:
Fragmento de aquí: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
fuente
También existe la solución delegada corta:
fuente
true
es inseguro.Se ha mencionado que antes de .NET 4.5 la propiedad de la solicitud de acceso
ServicePointManager
no estaba disponible.Aquí hay un código .NET 4.0 que le dará acceso a
ServicePoint
cada solicitud. No le da acceso a la devolución de llamada por solicitud, pero debería permitirle obtener más detalles sobre el problema. Simplemente acceda a las propiedadesscvPoint.Certificate
(oClientCertificate
si lo prefiere).fuente
ignore
no confiar en ellos.ServicePoint
No siempre puedo confiar en todos los certificados SSL, ni ignorar todos los certificados , porque no haServerCertificateValidationCallback
delegado en ServicePointPor cierto, esta es la forma menos detallada de desactivar toda la validación de certificados en una aplicación determinada que conozco:
fuente
En lugar de agregar una devolución de llamada a ServicePointManager que anulará la validación del certificado a nivel mundial, puede establecer la devolución de llamada en una instancia local de HttpClient. Este enfoque solo debería afectar a las llamadas realizadas con esa instancia de HttpClient.
Aquí hay un código de muestra que muestra cómo ignorar los errores de validación de certificados para servidores específicos podría implementarse en un controlador de API web.
fuente
Basado en la respuesta de Adam y el comentario de Rob, usé esto:
que filtra algo el "ignorar". Se pueden agregar otros emisores según se requiera, por supuesto. Esto se probó en .NET 2.0 ya que necesitamos admitir algunos códigos heredados.
fuente
CA5386: Las herramientas de análisis de vulnerabilidad lo alertarán sobre estos códigos.
Código correcto:
fuente
Para .net core
fuente
Expresado explícitamente ...
fuente
Agregando a las respuestas de Sani y blak3r, he agregado lo siguiente al código de inicio de mi aplicación, pero en VB:
Parece funcionar.
fuente
Consejo: También puede usar este método para rastrear certificados que vencen pronto. Esto puede salvar su tocino si descubre un certificado que está a punto de caducar y puede arreglarlo a tiempo. Bueno también para compañías de terceros: para nosotros, esto es DHL / FedEx. DHL acaba de dejar que un certificado expire, lo que nos está arruinando 3 días antes del Día de Acción de Gracias. Afortunadamente estoy para arreglarlo ... ¡esta vez!
fuente
ProwlUtil.StepReached
?Varias respuestas anteriores funcionan. Quería un enfoque que no tenía que seguir haciendo cambios en el código y no hice que mi código no fuera seguro. Por lo tanto, creé una lista blanca. La lista blanca se puede mantener en cualquier almacén de datos. Utilicé el archivo de configuración ya que es una lista muy pequeña.
Mi codigo esta abajo.
fuente
Versión Unity C # de esta solución:
fuente