Compartir certificados entre aplicacionesShare certificates between apps

Las aplicaciones para la Plataforma universal de Windows (UWP) que necesitan una autenticación segura que vaya más allá de una combinación de id. de usuario y contraseña pueden usar certificados para la autenticación.Universal Windows Platform (UWP) apps that require secure authentication beyond a user Id and password combination can use certificates for authentication. La autenticación de certificado ofrece un alto grado de confianza al autenticar a un usuario.Certificate authentication provides a high level of trust when authenticating a user. En algunos casos, un grupo de servicios querrá autenticar un usuario en varias aplicaciones.In some cases, a group of services will want to authenticate a user for multiple apps. 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.This article shows how you can authenticate multiple apps using the same certificate, and how you can provide convenient code for a user to import a certificate that was provided to access secured web services.

Las aplicaciones se pueden autenticar en un servicio web usando un certificado, y varias aplicaciones pueden usar un único certificado del almacén de certificados para autenticar el mismo usuario.Apps can authenticate to a web service using a certificate, and multiple apps can use a single certificate from the certificate store to authenticate the same user. Si un certificado no existe en el almacén, puedes agregar código a tu aplicación para importar un certificado desde un archivo PFX.If a certificate does not exist in the store, you can add code to your app to import a certificate from a PFX file.

Habilitar Microsoft Internet Information Services (IIS) y la asignación de certificados de clienteEnable Microsoft Internet Information Services (IIS) and client certificate mapping

En este artículo se usa Microsoft Internet Information Services (IIS) como ejemplo.This article uses Microsoft Internet Information Services (IIS) for example purposes. IIS no está habilitado de forma predeterminada.IIS is not enabled by default. Puedes habilitar IIS mediante el Panel de control.You can enable IIS by using the Control Panel.

  1. Abre el Panel de control y selecciona Programas.Open the Control Panel and select Programs.
  2. Seleccione activar o desactivar las características de Windows.Select Turn Windows features on or off.
  3. Expande Internet Information Services y, después, expande Servicios World Wide Web.Expand Internet Information Services and then expand World Wide Web Services. Expande Características de desarrollo de aplicaciones y selecciona ASP.NET 3.5 y ASP.NET 4.5.Expand Application Development Features and select ASP.NET 3.5 and ASP.NET 4.5. Al seleccionar estas opciones automáticamente se habilita Internet Information Services.Making these selections will automatically enable Internet Information Services.
  4. Haga clic en Aceptar para aplicar los cambios.Click OK to apply the changes.

Crear y publicar un servicio web protegidoCreate and publish a secured web service

  1. Inicia Microsoft Visual Studio como administrador y selecciona Nuevo proyecto en la página de inicio.Run Microsoft Visual Studio as administrator and select New Project from the start page. Se necesita acceso de administrador para publicar un servicio web en un servidor IIS.Administrator access is required to publish a web service to an IIS server. En el cuadro de diálogo Nuevo proyecto, cambia el marco de trabajo a .NET Framework 3.5.In the New Project dialog, change the framework to .NET Framework 3.5. Seleccione Visual C# - > Web - > Visual Studio - > ASP.NET Web Service Application.Select Visual C# -> Web -> Visual Studio -> ASP.NET Web Service Application. Asigna a la aplicación el nombre "FirstContosoBank".Name the application "FirstContosoBank". Haga clic en Aceptar para crear el proyecto.Click OK to create the project.

  2. En el archivo Service1.asmx.cs, cambia el método web predeterminado HelloWorld por el siguiente método "Login".In the Service1.asmx.cs file, replace the default HelloWorld web method with the following "Login" method.

            [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();
            }
    
  3. Guarda el archivo Service1.asmx.cs.Save the Service1.asmx.cs file.

  4. En el Explorador de soluciones, haz clic con el botón secundario en la aplicación "FirstContosoBank" y selecciona Publicar.In the Solution Explorer, right-click the "FirstContosoBank" app and select Publish.

  5. En el cuadro de diálogo Publicar web, crea un perfil nuevo y asígnale el nombre "ContosoProfile".In the Publish Web dialog, create a new profile and name it "ContosoProfile". Haga clic en Siguiente.Click Next.

  6. En la página siguiente, escribe el nombre de tu servidor IIS y especifica el nombre del "Sitio web predeterminado/FirstContosoBank".On the next page, enter the server name for your IIS server, and specify a site name of "Default Web Site/FirstContosoBank". Haz clic en Publicar para publicar tu servicio web.Click Publish to publish your web service.

Configurar el servicio web para que use la autenticación de certificados de clienteConfigure your web service to use client certificate authentication

  1. Ejecuta el Administrador de Internet Information Services (IIS).Run the Internet Information Services (IIS) Manager.
  2. Expande los sitios de tu servidor IIS.Expand the sites for your IIS server. En Sitio web predeterminado, selecciona el nuevo servicio web "FirstContosoBank".Under the Default Web Site, select the new "FirstContosoBank" web service. En la sección Acciones, selecciona Configuración avanzada....In the Actions section, select Advanced Settings....
  3. Establece Grupo de aplicaciones en .NET v2.0 y haz clic en Aceptar.Set the Application Pool to .NET v2.0 and click OK.
  4. En el Administrador de Internet Information Services (IIS), selecciona tu servidor IIS y haz doble clic en Certificados de servidor.In the Internet Information Services (IIS) Manager, select your IIS server and then double-click Server Certificates. En la sección acciones , seleccione crear certificado autofirmado.... Escriba "ContosoBank" como nombre descriptivo del certificado y haga clic en Aceptar.In the Actions section, select Create Self-Signed Certificate.... Enter "ContosoBank" as the friendly name for the certificate and click OK. Esto creará un nuevo certificado para que lo use el servidor IIS, con el formato "<nombre_de_servidor>.<nombre_de_dominio>".This will create a new certificate for use by the IIS server in the form of "<server-name>.<domain-name>".
  5. En el Administrador de Internet Information Services (IIS), selecciona el sitio web predeterminado.In the Internet Information Services (IIS) Manager, select the default web site. 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 del servidor IIS ("nombre del < servidor" > . < nombre de dominio > ").In the Actions section, select Binding and then click Add.... Select "https" as the type, set the port to "443", and enter the full host name for your IIS server ("<server-name>.<domain-name>"). Establece el certificado SSL en "ContosoBank".Set the SSL certificate to "ContosoBank". Haga clic en Aceptar.Click OK. Haz clic en Cerrar en la ventana Enlaces de sitios.Click Close in the Site Bindings window.
  6. En el Administrador de Internet Information Services (IIS), selecciona el servicio web "FirstContosoBank".In the Internet Information Services (IIS) Manager, select the "FirstContosoBank" web service. Haga doble clic en configuración de SSL.Double-click SSL Settings. Activa Requerir SSL.Check Require SSL. En Certificados de cliente, selecciona Requerir.Under Client certificates, select Require. En la sección Acciones, haz clic en Aplicar.In the Actions section, click Apply.
  7. Para comprobar que el servicio web está correctamente configurado, abre el explorador web y escribe la siguiente dirección web: "https://<nombre_de_servidor>.<nombre_de_dominio>/FirstContosoBank/Service1.asmx".You can verify that the web service is configured correctly by opening your web browser and entering the following web address: "https://<server-name>.<domain-name>/FirstContosoBank/Service1.asmx". Por ejemplo, "https://myserver.example.com/FirstContosoBank/Service1.asmx".For example, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Si tu servicio web está correctamente configurado, se te pedirá que selecciones un certificado de cliente para poder acceder al servicio web.If your web service is configured correctly, you will be prompted to select a client certificate in order to access the web service.

Puedes repetir los pasos anteriores para crear varios servicios web a los que se pueda acceder con el mismo certificado de cliente.You can repeat the previous steps to create multiple web services that can be accessed using the same client certificate.

Crear una aplicación para UWP que use la autenticación de certificadoCreate a UWP app that uses certificate authentication

Ahora que tienes uno o varios servicios web protegidos, tus aplicaciones pueden usar certificados para autenticar en esos servicios web.Now that you have one or more secured web services, your apps can use certificates to authenticate to those web services. Cuando se realiza una solicitud a un servicio web autenticado usando el objeto HttpClient, la solicitud inicial no contendrá un certificado de cliente.When you make a request to an authenticated web service using the HttpClient object, the initial request will not contain a client certificate. El servicio web autenticado responderá con una solicitud para autenticar el cliente.The authenticated web service will respond with a request for client authentication. Cuando esto ocurre, el cliente de Windows consultará automáticamente los certificados de cliente disponibles en el almacén de certificados.When this occurs, the Windows client will automatically query the certificate store for available client certificates. El usuario puede seleccionar uno de estos certificados para autenticarse en el servicio web.Your user can select from these certificates to authenticate to the web service. Algunos certificados están protegidos por contraseña, por lo que necesitarás proporcionar al usuario una manera de especificar la contraseña del certificado.Some certificates are password protected, so you will need to provide the user with a way to input the password for a certificate.

Si no hay certificados de cliente disponibles, el usuario tendrá que agregar un certificado al almacén de certificados.If there are no client certificates available, then the user will need to add a certificate to the certificate store. En tu aplicación puedes incluir código que permita al usuario seleccionar un archivo PFX que contenga un certificado de cliente y, después, importar ese certificado al almacén de certificados de cliente.You can include code in your app that enables a user to select a PFX file that contains a client certificate and then import that certificate into the client certificate store.

Sugerencia    Puede usar makecert.exe para crear un archivo PFX para usarlo con esta guía de inicio rápido.Tip  You can use makecert.exe to create a PFX file to use with this quickstart. Para obtener información sobre cómo usar makecert.exe, consulta MakeCert.For information on using makecert.exe, see MakeCert.

 

  1. Abre Visual Studio y crea un proyecto nuevo en la página de inicio.Open Visual Studio and create a new project from the start page. Asigna el nombre "FirstContosoBankApp" al nuevo proyecto.Name the new project "FirstContosoBankApp". Haga clic en Aceptar para crear el proyecto nuevo.Click OK to create the new project.

  2. En el archivo MainPage.xaml, agrega el siguiente código XAML en el elemento Cuadrícula predeterminado.In the MainPage.xaml file, add the following XAML to the default Grid element. Este XAML incluye un botón para buscar el archivo PFX que se va a importar, un cuadro de texto para especificar una contraseña para un archivo PFX protegido por 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.This XAML includes a button to browse for a PFX file to import, a text box to enter a password for a password-protected PFX file, a button to import a selected PFX file, a button to log in to the secured web service, and a text block to display the status of the current action.

    <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"/>
    
  3. Guarda el archivo MainPage.xaml.Save the MainPage.xaml file.

  4. En el archivo MainPage.xaml.cs, agrega las siguientes instrucciones using:In the MainPage.xaml.cs file, add the following using statements.

    using Windows.Web.Http;
    using System.Text;
    using Windows.Security.Cryptography.Certificates;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    using Windows.Storage.Streams;
    
  5. En el archivo MainPage.xaml.cs, agrega las siguientes variables a la clase MainPage.In the MainPage.xaml.cs file, add the following variables to the MainPage class. Especifican la dirección del método "Login" protegido de tu servicio web "FirstContosoBank" y una variable global que guarda un certificado PFX para importar en el almacén de certificados.They specify the address for the secured "Login" method of your "FirstContosoBank" web service, and a global variable that holds a PFX certificate to import into the certificate store. Actualiza el <nombre_de_servidor> al nombre completo de tu servidor Microsoft Internet Information Server (IIS).Update the <server-name> to the fully-qualified server name for your Microsoft Internet Information Server (IIS) server.

    private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    private string pfxCert = null;
    
  6. En el archivo MainPage.xaml.cs, agrega el siguiente controlador de clic para el botón de inicio de sesión y el método para obtener acceso al servicio web protegido.In the MainPage.xaml.cs file, add the following click handler for the login button and method to access the secured web service.

    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();
    }
    
  7. En el archivo MainPage.xaml.cs, agrega los siguientes controladores de clic para el botón para buscar un archivo PFX y el botón para importar un archivo PFX seleccionado al almacén de certificados.In the MainPage.xaml.cs file, add the following click handlers for the button to browse for a PFX file and the button to import a selected PFX file into the certificate store.

    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 succeded";
        }
        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();
    }
    
  8. Ejecuta tu aplicación e inicia sesión en tu servicio web protegido, e importa además un archivo PFX al almacén de certificados local.Run your app and log in to your secured web service as well as import a PFX file into the local certificate store.

Puedes usar estos pasos para crear varias aplicaciones que usen el mismo certificado de usuario para obtener acceso a servicios web protegidos iguales o diferentes.You can use these steps to create multiple apps that use the same user certificate to access the same or different secured web services.