net - ssl web api c#
Cliente.NET que se conecta a la API web ssl (3)
Eche un vistazo a la pregunta C # Ignorar errores de certificado . Creo que puede agregar un controlador de validación de certificados utilizando ServicePointManager para eludir la validación de certificados. Sin embargo, probablemente sería una buena idea utilizar un certificado firmado en su entorno de producción.
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
Tengo una API web ASP.NET que me gustaría usar con ssl. Actualmente, el servidor está utilizando un certificado autofirmado, y en este momento se permiten http y https. Tengo un cliente de prueba muy básico que funciona bien para http, pero no funciona para https. Me gustaría saber cómo modificar el código de cliente a continuación para que funcione con https. Actualmente, IE, Firefox y Chrome pueden conectarse a la API web utilizando http y https (con advertencias de certificación), por lo que creo que no debería tener que modificar nada en el servidor, solo el código del cliente. Aquí está el código del cliente:
static void Main(string[] args)
{
try
{
if (args.Length != 1)
{
Console.WriteLine("Please provide a url, and only a url.");
return;
}
var url = new Uri(args[0]);
var urlAuthority = url.GetLeftPart(UriPartial.Authority);
var urlPathQuery = args[0].Substring(urlAuthority.Length);
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlAuthority);
HttpResponseMessage response = client.GetAsync(urlPathQuery).Result;
if (response.IsSuccessStatusCode)
Console.WriteLine(response.Content.ReadAsAsync<string>().Result); // expecting scalar results only
else
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
catch (Exception ex)
{
Exception tempEx = ex;
while (tempEx != null)
{
Console.WriteLine(tempEx.Message);
tempEx = tempEx.InnerException;
}
}
}
Cuando ejecuto el código anterior con mi URL http, funciona bien. Cuando cambio la URL a https, se imprimen los siguientes errores:
One or more errors occurred.
An error occurred while sending the request.
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
The remote certificate is invalid according to the validation procedure.
Una pregunta que tengo es si el cliente debe enviar manualmente una clave pública al servidor para que sepa cómo enviar una respuesta encriptada, o si esto sucede automáticamente entre bambalinas. Y segundo, ahora, después de ver el último error, me pregunto si también tengo que hacer algo más dentro del cliente para ignorar las advertencias de certificación y simplemente confiar en que esta certificación está bien para continuar.
Este mensaje de error significa que el cliente no confía en el certificado del servidor durante el protocolo de enlace SSL. Algunos navegadores son un poco más indulgentes y le dan una "barra roja", pero las llamadas desde el código darán como resultado un 401 y una llamada rechazada.
No necesita hacer nada con la configuración del certificado de cliente en IIS (porque asumo que no está utilizando un certificado de cliente).
Este mensaje de excepción le indica que la cadena de certificados autofirmados se rechaza al validar en el cliente. Puede estar a punto de evitar esto mediante la exportación (sin la clave privada), el certificado autofirmado e instalarlo en la máquina cliente como un certificado raíz.
Si esto no funciona, debe crear una nueva CA (certificado de autoridad de certificación) y luego generar una nueva certificación de servidor que esté firmada con la CA. Esta CA finalmente tendría que instalarse en la máquina cliente como un certificado raíz.
Esta es una buena publicación que muestra el proceso usando makecert y pvk2pfx.
EDITAR: Parece que podría haber una manera de configurar HttpClient
para ignorar los errores de SSL. Pero, le sugiero que trate de no tener errores de SSL desde el principio.
Esto funcionó para mí. Simplemente agregue lo siguiente antes de la llamada a GetAsync.
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Esto ignorará los errores de SSL. Esto solo se recomienda en un entorno de intranet u otra red cerrada donde las identidades del servidor no puedan ser falsificadas.