Compartir certificados entre aplicaciones
Plataforma universal de Windows aplicaciones (UWP) que requieren autenticación segura más allá de una combinación de identificador de usuario y contraseña pueden usar certificados para la autenticación. La autenticación de certificado ofrece un alto grado de confianza al autenticar a un usuario. En algunos casos, un grupo de servicios querrá autenticar un usuario en varias aplicaciones. En este artículo se muestra cómo puedes autenticar varias aplicaciones usando el mismo certificado, y cómo facilitar un práctico código para que un usuario importe un certificado ofrecido para obtener acceso a servicios web protegidos.
Las aplicaciones se pueden autenticar en un servicio web mediante un certificado y varias aplicaciones pueden usar un único certificado del almacén de certificados para autenticar al mismo usuario. Si un certificado no existe en el almacén, puede agregar código a la aplicación para importar un certificado desde un archivo PFX.
Habilitar Microsoft Internet Information Services (IIS) y la asignación de certificados de cliente
En este artículo se usa Microsoft Internet Information Services (IIS) por ejemplo. IIS no está habilitado de forma predeterminada. Puede habilitar IIS mediante el Panel de control.
- Abra el Panel de control y seleccione Programas.
- Seleccione Activar o desactivar las características de Windows.
- Expanda Internet Information Services y, a continuación, expanda World Wide Web Services. Expanda Características de desarrollo de aplicaciones y seleccione ASP.NET 3.5 y ASP.NET 4.5. Al realizar estas selecciones, se habilitará automáticamente Internet Information Services.
- Haga clic en Aceptar para aplicar los cambios.
Creación y publicación de un servicio web protegido
Ejecute Microsoft Visual Studio como administrador y seleccione Nuevo proyecto en la página de inicio. El acceso de administrador es necesario para publicar un servicio web en un servidor IIS. En el cuadro de diálogo Nuevo proyecto, cambie el marco a .NET Framework 3.5. Seleccione Visual C# ->Web -Visual Studio ->>ASP.NET aplicación de servicio web. Asigne un nombre a la aplicación "FirstContosoBank". Haga clic en Aceptar para crear el proyecto.
En el archivo Service1.asmx.cs, reemplace el método web HelloWorld predeterminado por el siguiente método "Login".
[WebMethod] public string Login() { // Verify certificate with CA var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2( this.Context.Request.ClientCertificate.Certificate); bool test = cert.Verify(); return test.ToString(); }
Guarde el archivo Service1.asmx.cs .
En el Explorador de soluciones, haga clic con el botón derecho en la aplicación "FirstContosoBank" y seleccione Publicar.
En el cuadro de diálogo Publicar web , cree un nuevo perfil y asígnelo el nombre "ContosoProfile". Haga clic en Next.
En la página siguiente, escriba el nombre del servidor de IIS y especifique un nombre de sitio de "Sitio web predeterminado/FirstContosoBank". Haga clic en Publicar para publicar el servicio web.
Configuración del servicio web para usar la autenticación de certificados de cliente
- Ejecute el Administrador de Internet Information Services (IIS).
- Expanda los sitios del servidor IIS. En el sitio web predeterminado, seleccione el nuevo servicio web "FirstContosoBank". En la sección Acciones , seleccione Configuración avanzada....
- Establezca el grupo de aplicaciones en .NET v2.0 y haga clic en Aceptar.
- En el Administrador de Internet Information Services (IIS), seleccione el servidor IIS y, a continuación, haga doble clic en Certificados de servidor. En la sección Acciones , seleccione Crear certificado autofirmado.... Escriba "ContosoBank" como nombre descriptivo para el certificado y haga clic en Aceptar. Esto creará un nuevo certificado para que lo use el servidor IIS en forma de "<nombre> de servidor.<domain-name>".
- En el Administrador de Internet Information Services (IIS), seleccione el sitio web predeterminado. En la sección Acciones , seleccione Enlace y, a continuación, haga clic en Agregar.... Seleccione "https" como tipo, establezca el puerto en "443" y escriba el nombre de host completo para el servidor IIS ("<nombre> del servidor).<nombre de> dominio"). Establezca el certificado SSL en "ContosoBank". Haga clic en OK. Haga clic en Cerrar en la ventana Enlaces de sitio.
- En el Administrador de Internet Information Services (IIS), seleccione el servicio web "FirstContosoBank". Haga doble clic en Configuración de SSL. Active Requerir SSL. En Certificados de cliente, seleccione Requerir. En la sección Acciones , haga clic en Aplicar.
- Para comprobar que el servicio web está configurado correctamente, abra el explorador web y escriba la siguiente dirección web: "https://< server-name>.<domain-name>/FirstContosoBank/Service1.asmx". Por ejemplo, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Si el servicio web está configurado correctamente, se le pedirá que seleccione un certificado de cliente para acceder al servicio web.
Puede repetir los pasos anteriores para crear varios servicios web a los que se puede acceder mediante el mismo certificado de cliente.
Crear una aplicación para UWP que use la autenticación de certificados
Ahora que tiene uno o varios servicios web protegidos, las aplicaciones pueden usar certificados para autenticarse en esos servicios web. Al realizar una solicitud a un servicio web autenticado mediante el objeto HttpClient , la solicitud inicial no contendrá un certificado de cliente. El servicio web autenticado responderá con una solicitud de autenticación de cliente. Cuando esto ocurre, el cliente de Windows consultará automáticamente el almacén de certificados para obtener los certificados de cliente disponibles. El usuario puede seleccionar entre estos certificados para autenticarse en el servicio web. Algunos certificados están protegidos con contraseña, por lo que deberá proporcionar al usuario una manera de escribir la contraseña de un certificado.
Si no hay ningún certificado de cliente disponible, el usuario deberá agregar un certificado al almacén de certificados. Puede incluir código en la aplicación que permita a un usuario seleccionar un archivo PFX que contenga un certificado de cliente y, a continuación, importar ese certificado en el almacén de certificados de cliente.
Sugerencia Puede usar makecert.exe para crear un archivo PFX para usarlo con este inicio rápido. Para obtener información sobre el uso de makecert.exe, consulte MakeCert.
Abra Visual Studio y cree un nuevo proyecto desde la página de inicio. Asigne al nuevo proyecto el nombre "FirstContosoBankApp". Haga clic en Aceptar para crear el proyecto nuevo.
En el archivo MainPage.xaml, agregue el siguiente XAML al elemento Grid predeterminado. Este XAML incluye un botón para buscar un archivo PFX que se va a importar, un cuadro de texto para escribir una contraseña para un archivo PFX protegido con contraseña, un botón para importar un archivo PFX seleccionado, un botón para iniciar sesión en el servicio web protegido y un bloque de texto para mostrar el estado de la acción actual.
<Button x:Name="Import" Content="Import Certificate (PFX file)" HorizontalAlignment="Left" Margin="352,305,0,0" VerticalAlignment="Top" Height="77" Width="260" Click="Import_Click" FontSize="16"/> <Button x:Name="Login" Content="Login" HorizontalAlignment="Left" Margin="611,305,0,0" VerticalAlignment="Top" Height="75" Width="240" Click="Login_Click" FontSize="16"/> <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="355,398,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="153" Width="560"/> <PasswordBox x:Name="PfxPassword" HorizontalAlignment="Left" Margin="483,271,0,0" VerticalAlignment="Top" Width="229"/> <TextBlock HorizontalAlignment="Left" Margin="355,271,0,0" TextWrapping="Wrap" Text="PFX password" VerticalAlignment="Top" FontSize="18" Height="32" Width="123"/> <Button x:Name="Browse" Content="Browse for PFX file" HorizontalAlignment="Left" Margin="352,189,0,0" VerticalAlignment="Top" Click="Browse_Click" Width="499" Height="68" FontSize="16"/> <TextBlock HorizontalAlignment="Left" Margin="717,271,0,0" TextWrapping="Wrap" Text="(Optional)" VerticalAlignment="Top" Height="32" Width="83" FontSize="16"/>
Guarde el archivo MainPage.xaml.
En el archivo MainPage.xaml.cs, agregue las siguientes instrucciones using.
using Windows.Web.Http; using System.Text; using Windows.Security.Cryptography.Certificates; using Windows.Storage.Pickers; using Windows.Storage; using Windows.Storage.Streams;
En el archivo MainPage.xaml.cs, agregue las siguientes variables a la clase MainPage . Especifican la dirección del método seguro "Login" del servicio web "FirstContosoBank" y una variable global que contiene un certificado PFX que se va a importar en el almacén de certificados. Actualice el nombre> del <servidor al nombre completo del servidor para el servidor de Microsoft Internet Information Server (IIS).
private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login"); private string pfxCert = null;
En el archivo MainPage.xaml.cs, agregue el siguiente controlador de clic para el botón de inicio de sesión y el método para acceder al servicio web protegido.
private void Login_Click(object sender, RoutedEventArgs e) { MakeHttpsCall(); } private async void MakeHttpsCall() { StringBuilder result = new StringBuilder("Login "); HttpResponseMessage response; try { Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient(); response = await httpClient.GetAsync(requestUri); if (response.StatusCode == HttpStatusCode.Ok) { result.Append("successful"); } else { result = result.Append("failed with "); result = result.Append(response.StatusCode); } } catch (Exception ex) { result = result.Append("failed with "); result = result.Append(ex.Message); } Result.Text = result.ToString(); }
En el archivo MainPage.xaml.cs, agregue los siguientes controladores de clic para el botón para buscar un archivo PFX y el botón para importar un archivo PFX seleccionado en el almacén de certificados.
private async void Import_Click(object sender, RoutedEventArgs e) { try { Result.Text = "Importing selected certificate into user certificate store...."; await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync( pfxCert, PfxPassword.Password, ExportOption.Exportable, KeyProtectionLevel.NoConsent, InstallOptions.DeleteExpired, "Import Pfx"); Result.Text = "Certificate import succeeded"; } catch (Exception ex) { Result.Text = "Certificate import failed with " + ex.Message; } } private async void Browse_Click(object sender, RoutedEventArgs e) { StringBuilder result = new StringBuilder("Pfx file selection "); FileOpenPicker pfxFilePicker = new FileOpenPicker(); pfxFilePicker.FileTypeFilter.Add(".pfx"); pfxFilePicker.CommitButtonText = "Open"; try { StorageFile pfxFile = await pfxFilePicker.PickSingleFileAsync(); if (pfxFile != null) { IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile); using (DataReader dataReader = DataReader.FromBuffer(buffer)) { byte[] bytes = new byte[buffer.Length]; dataReader.ReadBytes(bytes); pfxCert = System.Convert.ToBase64String(bytes); PfxPassword.Password = string.Empty; result.Append("succeeded"); } } else { result.Append("failed"); } } catch (Exception ex) { result.Append("failed with "); result.Append(ex.Message); ; } Result.Text = result.ToString(); }
Ejecute la aplicación e inicie sesión en el servicio web protegido, así como importe un archivo PFX en el almacén de certificados local.
Puede usar estos pasos para crear varias aplicaciones que usen el mismo certificado de usuario para acceder a los mismos servicios web protegidos o diferentes.