Trabajar con SSL en web API
Varios esquemas de autenticación comunes no son seguros a través de HTTP sin cifrar. En concreto, la autenticación básica y la autenticación de formularios envían credenciales sin cifrar. Para ser seguro, estos esquemas de autenticación deben usar SSL. Además, los certificados de cliente SSL se pueden usar para autenticar a los clientes.
Habilitación de SSL en el servidor
Para configurar SSL en IIS 7 o posterior:
- Cree o obtenga un certificado. Para las pruebas, puede crear un certificado autofirmado.
- Agregue un enlace HTTPS.
Para obtener más información, consulte Configuración de SSL en IIS 7.
Para las pruebas locales, puede habilitar SSL en IIS Express desde Visual Studio. En la ventana Propiedades, establezca SSL habilitado en True. Anote el valor de dirección URL SSL; use esta dirección URL para probar las conexiones HTTPS.
Aplicación de SSL en un controlador de API web
Si tiene un enlace HTTPS y HTTP, los clientes pueden seguir usando HTTP para acceder al sitio. Es posible que permita que algunos recursos estén disponibles a través de HTTP, mientras que otros recursos requieren SSL. En ese caso, use un filtro de acción para requerir SSL para los recursos protegidos. En el código siguiente se muestra un filtro de autenticación de API web que comprueba si hay SSL:
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
base.OnAuthorization(actionContext);
}
}
}
Agregue este filtro a cualquier acción de API web que requiera SSL:
public class ValuesController : ApiController
{
[RequireHttps]
public HttpResponseMessage Get() { ... }
}
Certificados de cliente SSL
SSL proporciona autenticación mediante certificados de infraestructura de clave pública. El servidor debe proporcionar un certificado que autentique el servidor en el cliente. Es menos habitual que el cliente proporcione un certificado al servidor, pero esta es una opción para autenticar a los clientes. Para usar certificados de cliente con SSL, necesita una manera de distribuir certificados firmados a los usuarios. Para muchos tipos de aplicaciones, esto no será una buena experiencia de usuario, pero en algunos entornos (por ejemplo, empresa) puede ser factible.
Ventajas | Desventajas |
---|---|
- Las credenciales de certificado son más seguras que el nombre de usuario y la contraseña. - SSL proporciona un canal seguro completo, con autenticación, integridad de mensajes y cifrado de mensajes. | - Debe obtener y administrar certificados PKI. - La plataforma cliente debe admitir certificados de cliente SSL. |
Para configurar IIS para que acepte certificados de cliente, abra el Administrador de IIS y realice los pasos siguientes:
Haga clic en el nodo del sitio en la vista de árbol.
Haga doble clic en la característica Configuración de SSL en el panel central.
En Certificados de cliente, seleccione una de estas opciones:
- Aceptar: IIS aceptará un certificado del cliente, pero no requiere uno.
- Requerir: se requiere un certificado de cliente. (Para habilitar esta opción, también debe seleccionar "Requerir SSL")
También puede establecer estas opciones en el archivo ApplicationHost.config:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<!-- To require a client cert: -->
<!-- <access sslFlags="Ssl, SslRequireCert" /> -->
</security>
</system.webServer>
La marca sslNegotiateCert
Creación de un certificado de cliente para pruebas
Con fines de prueba, puede usar MakeCert.exe para crear un certificado de cliente. En primer lugar, cree una autoridad raíz de prueba:
makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer
Makecert le pedirá que escriba una contraseña para la clave privada.
A continuación, agregue el certificado al almacén "Entidades de certificación raíz de confianza" del servidor de prueba, como se indica a continuación:
- Abra MMC.
- En Archivo, seleccione Agregar o quitar complemento.
- En Complementos disponibles, seleccione Certificados y haga clic en Agregar.
- Seleccione Cuenta de equipo.
- Seleccione Equipo local y complete el asistente.
- En el panel de navegación, expanda el nodo "Entidades de certificación raíz de confianza".
- En el menú Acción, apunte a Todas las tareas y, a continuación, haga clic en Importar a fin de iniciar el Asistente para importación de certificados.
- Navegue hasta el archivo de certificado TempCA.cer.
- Haga clic en Abrir, después en Siguiente y complete el asistente. (Se le pedirá que vuelva a escribir la contraseña).
Ahora cree un certificado de cliente firmado por el primer certificado:
makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name"
-eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk
Uso de certificados de cliente en la API web
En el lado servidor, puede obtener el certificado de cliente llamando a GetClientCertificate en el mensaje de solicitud. El método devuelve null si no hay ningún certificado de cliente. De lo contrario, devuelve una instancia X509Certificate2. Use este objeto para obtener información del certificado, como el emisor y el asunto. A continuación, puede usar esta información para la autenticación o autorización.
X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;