Cómo ignorar a un error de certificado con c# 2.0 WebClient - sin el certificado

StackOverflow https://stackoverflow.com/questions/1301127

  •  18-09-2019
  •  | 
  •  

Pregunta

El Uso De Visual Studio 2005 C# 2.0, System.Net.WebClient.UploadData(Uri address, byte[] data) Windows Server 2003

Así que aquí es una versión simplificada del código:

static string SO_method(String fullRequestString)
{
    string theUriStringToUse = @"https://10.10.10.10:443"; // populated with real endpoint IP:port
    string proxyAddressAndPort = @"http://10.10.10.10:80/"; // populated with a real proxy IP:port
    Byte[] utf8EncodedResponse; // for the return data in utf8
    string responseString; // for the return data in utf16

    WebClient myWebClient = new WebClient(); // instantiate a web client
    WebProxy proxyObject = new WebProxy(proxyAddressAndPort, true);// instantiate & popuylate a web proxy
    myWebClient.Proxy = proxyObject; // add the proxy to the client
    myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // stick some stuff in the header

    UTF8Encoding utf8Encoding = new UTF8Encoding(false);// create a utf8 encoding
    Byte[] utf8EncodedRequest = HttpUtility.UrlEncodeToBytes(fullRequestString, utf8Encoding); // convert the request data to a utf8 byte array

    try
    {
        utf8EncodedResponse = myWebClient.UploadData(theUriStringToUse, "POST", utf8EncodedRequest); // pass the utf8-encoded byte array
        responseString = utf8Encoding.GetString(utf8EncodedResponse); // get a useable string out of the response
    }
    catch (Exception e)
    {
        // some other error handling
        responseString = "<CommError><![CDATA[" + e.ToString() + "]]></CommError>";// show the basics of the problem
    }
    return responseString;// return whatever ya got
}

Este es el error:

La conexión se cerró:No se puede establecer una relación de confianza para el canal seguro SSL/TLS.

No tengo mucho control para ver lo que sucede cuando la solicitud va fuera.Me han dicho que es llegar al destino correcto y que hay un "error de certificado".Este es supuestamente porque hay una literal de la falta de coincidencia entre la dirección IP en mi solicitud y la URL se resuelve.Puedo tener más de una IP se supone que voy round-robin para así especificar la dirección URL no funciona.No estoy adjuntando un certificado - ni se supone que tengo que de acuerdo a la estación propietarios.Por "ellos", el certificado de error es " normal y se supone que debo ignorarlo.

El cert en cuestión es supuestamente uno de los muchos verisign certs que está "ahí" en nuestro servidor.Los ejemplos que he visto por ignorar cert errores todos parecen implicar que el solicitante es asociar un determinado certificado x509 (que no soy).

Me miró por encima .net WebService, bypass ssl de validación! que poco-sorta describe mi problema - excepto que es también un poco-sorta no, porque no sé qué certificado (si alguna) que debo de referencia.

Hay una manera para mí para ignorar el error, sin conocer realmente/cuidar lo certificado está causando el problema?

  • y por favor - guantes de cabritilla, pequeñas palabras, y "for dummies" código como yo no soy exactamente un peso pesado.

  • Este tráfico es a través de una línea privada - por lo que mi entendimiento es que el desconocimiento de los cert de error no es tan grande de un acuerdo, como si se tratara de abrir el tráfico de internet.

¿Fue útil?

Solución

El certificado SSL es una máquina para establecer una relación de confianza. Si escribe en una dirección IP, y termina hablando con otro, que suena igual que un fallo de seguridad secuestro de DNS, el tipo de cosas SSL tiene la intención de ayudar a evitar - y tal vez algo que no desea que aguantar de "ellos".

Si usted puede terminar de hablar con más de máquina (lo ideal es que habría que parezca que uno para usted), necesitará un certificado para cada una de las máquinas posible iniciar la confianza.

Para ignorar la confianza (sólo he tenido que hacer esto temporalmente en escenarios de desarrollo) el siguiente fragmento puede trabajar para usted, pero yo recomiendo que considerar el impacto de ignorar la confianza antes de utilizarlo:

public static void InitiateSSLTrust()
{
    try
    {
        //Change SSL checks so that all checks pass
        ServicePointManager.ServerCertificateValidationCallback =
           new RemoteCertificateValidationCallback(
                delegate
                { return true; }
            );
    }
    catch (Exception ex)
    {
        ActivityLog.InsertSyncActivity(ex);
    }
}

Otros consejos

Me di cuenta que es una entrada antigua, pero sólo quería demostrar que hay una manera más corta a mano de hacer esto (con .NET 3.5 + y posteriores).

Tal vez sea sólo mi TOC, pero quería minimizar este código tanto como sea posible. Este parece ser el camino más corto para hacerlo, pero también he enumeran a continuación algunos más largos equivalentes:

// 79 Characters (72 without spaces)
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

forma más corta en .NET 2.0 (que es lo que la pregunta estaba pidiendo específicamente sobre)

// 84 Characters
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Es desafortunado que la forma de lambda se requiere para definir los parámetros, de lo contrario, podría ser aún más corto.

Y en caso de que necesite una manera mucho más tiempo, aquí hay algunas alternativas adicionales:

ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;

ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };

// 255 characters - lots of code!
ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(
        delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        });

Este código es mucho más amplio de lo que cabría esperar. Es de gran proceso. El proceso podría ser el exe, IIS en este equipo, o incluso Dllhost.exe. Después de llamar a él, tener un bloque finally que restaura las cosas a la normalidad mediante la eliminación del delegado que siempre devuelve verdadero.

Esto es un poco el código que estamos usando (no pulido todavía - Yo no creo que tenga la configuración de control de errores correctamente pero debe estar cerca) basado en la sugerencia de Thomas (esto es .NET 4.0 código, sin embargo) :

var sslFailureCallback = new RemoteCertificateValidationCallback(delegate { return true; });

try
{

    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback += sslFailureCallback;
    }

    response = webClient.UploadData(Options.Address, "POST", Encoding.ASCII.GetBytes(Options.PostData));

}
catch (Exception err)
{
    PageSource = "POST Failed:\r\n\r\n" + err;
    return PageSource;
}
finally
{
    if (ignoreSslErrors)
    {
        ServicePointManager.ServerCertificateValidationCallback -= sslFailureCallback;
    }
}

que se quiere desactivar la verificación SSL para un dominio específico sin globalmente desactivarlo porque puede haber otras solicitudes de funcionamiento que no deben verse afectadas, por lo que me ocurrió con esta solución (tenga en cuenta que uri es una variable dentro de una clase:

        private byte[] UploadValues(string method, NameValueCollection data)
        {
            var client = new WebClient();

            try
            {
                ServicePointManager.ServerCertificateValidationCallback +=
                    ServerCertificateValidation;

                returnrclient.UploadValues(uri, method, parameters);

            }
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback -=
                    ServerCertificateValidation;
            }
        }

        private bool ServerCertificateValidation(object sender,
            X509Certificate certificate, X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            var request = sender as HttpWebRequest;
            if (request != null && request.Address.Host.Equals(
                this.uri.Host, StringComparison.OrdinalIgnoreCase))
                return true;
            return false;
        }

Este es el código para hacer VB.net WebClient ignorar el certificado SSL.

Net.ServicePointManager.ServerCertificateValidationCallback = New Net.Security.RemoteCertificateValidationCallback(Function() True)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top