Partager des certificats entre applicationsShare certificates between apps

Les applications de plateforme Windows universelle (UWP) qui nécessitent une authentification sécurisée au-delà d’une combinaison identifiant utilisateur et mot de passe peuvent utiliser des certificats à des fins d’authentification.Universal Windows Platform (UWP) apps that require secure authentication beyond a user Id and password combination can use certificates for authentication. L’authentification par certificat permet d’authentifier un utilisateur avec un niveau de confiance élevé.Certificate authentication provides a high level of trust when authenticating a user. Dans certains cas, un groupe de services peut authentifier un utilisateur pour plusieurs applications.In some cases, a group of services will want to authenticate a user for multiple apps. Cet article montre comment authentifier plusieurs applications à l’aide du même certificat. Vous apprendrez également à écrire du code pour permettre à un utilisateur d’importer un certificat fourni pour accéder à des services web sécurisés.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.

Les applications peuvent s’authentifier auprès d’un service web à l’aide d’un certificat, et plusieurs applications peuvent utiliser un même certificat du magasin de certificats pour authentifier le même utilisateur.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 certificat n’existe pas dans le magasin, vous pouvez ajouter du code à votre application pour importer un certificat à partir d’un fichier 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.

Activer Microsoft Internet Information Services (IIS) et le mappage des certificats clientsEnable Microsoft Internet Information Services (IIS) and client certificate mapping

Cet article utilise Microsoft Internet Information Services (IIS) à titre d’exemple.This article uses Microsoft Internet Information Services (IIS) for example purposes. IIS n’est pas activé par défaut.IIS is not enabled by default. Vous pouvez activer IIS via le Panneau de configuration.You can enable IIS by using the Control Panel.

  1. Ouvrez le Panneau de configuration, puis sélectionnez Programmes.Open the Control Panel and select Programs.
  2. Sélectionnez activer ou désactiver des fonctionnalités Windows.Select Turn Windows features on or off.
  3. Développez Internet Information Services, puis Services World Wide Web.Expand Internet Information Services and then expand World Wide Web Services. Développez Fonctionnalités de développement d’applications, puis sélectionnez ASP.NET 3.5 et ASP.NET 4.5.Expand Application Development Features and select ASP.NET 3.5 and ASP.NET 4.5. Ces sélections permettent d’activer automatiquement Internet Information Services.Making these selections will automatically enable Internet Information Services.
  4. Cliquez sur OK pour appliquer les modifications.Click OK to apply the changes.

Créer et publier un service web sécuriséCreate and publish a secured web service

  1. Exécutez Microsoft Visual Studio en tant qu’administrateur et sélectionnez Nouveau projet dans la page de démarrage.Run Microsoft Visual Studio as administrator and select New Project from the start page. Un accès administrateur est requis pour publier un service web sur un serveur IIS.Administrator access is required to publish a web service to an IIS server. Dans la boîte de dialogue Nouveau projet, sélectionnez .NET Framework 3.5.In the New Project dialog, change the framework to .NET Framework 3.5. Sélectionnez Visual C# - > Web - > Visual C# - > application de service Web ASP.net.Select Visual C# -> Web -> Visual Studio -> ASP.NET Web Service Application. Nommez l’application « FirstContosoBank ».Name the application "FirstContosoBank". Cliquez sur OK pour créer le projet.Click OK to create the project.

  2. Dans le fichier Service1.asmx.cs, remplacez la méthode Web HelloWorld par défaut par la méthode « Login » suivante.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. Enregistrez le fichier Service1.asmx.cs.Save the Service1.asmx.cs file.

  4. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur l’application « FirstContosoBank », puis sélectionnez Publier.In the Solution Explorer, right-click the "FirstContosoBank" app and select Publish.

  5. Dans la boîte de dialogue Publier le site Web, créez un profil et nommez-le « ContosoProfile ».In the Publish Web dialog, create a new profile and name it "ContosoProfile". Cliquez sur Suivant.Click Next.

  6. Dans la page suivante, entrez le nom de votre serveur IIS, puis spécifiez le nom de site « Default Web Site/FirstContosoBank ».On the next page, enter the server name for your IIS server, and specify a site name of "Default Web Site/FirstContosoBank". Cliquez sur Publier pour publier votre service web.Click Publish to publish your web service.

Configurer votre service web de manière à utiliser l’authentification par certificat clientConfigure your web service to use client certificate authentication

  1. Exécutez le Gestionnaire des services Internet (IIS).Run the Internet Information Services (IIS) Manager.
  2. Développez les sites pour votre serveur IIS.Expand the sites for your IIS server. Sous Site Web par défaut, sélectionnez le nouveau service web « FirstContosoBank ».Under the Default Web Site, select the new "FirstContosoBank" web service. Dans la section Actions, sélectionnez Paramètres avancés.In the Actions section, select Advanced Settings....
  3. Choisissez .NET v2.0 comme Pool d’applications, puis cliquez sur OK.Set the Application Pool to .NET v2.0 and click OK.
  4. Dans le Gestionnaire des services Internet (IIS), sélectionnez votre serveur IIS, puis double-cliquez sur Certificats de serveur.In the Internet Information Services (IIS) Manager, select your IIS server and then double-click Server Certificates. Dans la section actions , sélectionnez créer un certificat auto-signé.... Entrez « ContosoBank » comme nom convivial pour le certificat, puis cliquez sur OK.In the Actions section, select Create Self-Signed Certificate.... Enter "ContosoBank" as the friendly name for the certificate and click OK. Un certificat est alors créé au format « <nom-serveur>.<nom-domaine> » pour le serveur IIS.This will create a new certificate for use by the IIS server in the form of "<server-name>.<domain-name>".
  5. Dans le Gestionnaire des services Internet (IIS), sélectionnez le site web par défaut.In the Internet Information Services (IIS) Manager, select the default web site. Dans la section actions , sélectionnez liaison , puis cliquez sur Ajouter.... Sélectionnez « https » comme type, définissez le port sur « 443 », puis entrez le nom d’hôte complet de votre serveur IIS (« < Server-name » > . < Domain-Name > »).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>"). Définissez « ContosoBank » comme certificat SSL.Set the SSL certificate to "ContosoBank". Cliquez sur OK.Click OK. Cliquez sur Fermer dans la fenêtre Liaisons de sites.Click Close in the Site Bindings window.
  6. Dans le Gestionnaire des services Internet (IIS), sélectionnez le service web « FirstContosoBank ».In the Internet Information Services (IIS) Manager, select the "FirstContosoBank" web service. Double-cliquez sur Paramètres SSL.Double-click SSL Settings. Cochez Exiger SSL.Check Require SSL. Sous Certificats clients, sélectionnez Demander.Under Client certificates, select Require. Dans la section Actions, sélectionnez Appliquer.In the Actions section, click Apply.
  7. Pour vérifier que le service Web est configuré correctement, ouvrez votre navigateur et entrez l’adresse Web suivante : « https://<nom-serveur>.<nom-domaine>/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". par exemple, « https://myserver.example.com/FirstContosoBank/Service1.asmx ».For example, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Si votre service web est correctement configuré, vous êtes invité à sélectionner un certificat client pour accéder au service web.If your web service is configured correctly, you will be prompted to select a client certificate in order to access the web service.

Vous pouvez répéter les étapes précédentes pour créer plusieurs services Web accessibles à l’aide du même certificat client.You can repeat the previous steps to create multiple web services that can be accessed using the same client certificate.

Créer une application UWP qui utilise l’authentification par certificatCreate a UWP app that uses certificate authentication

Maintenant que vous avez un ou plusieurs services web sécurisés, vos applications peuvent utiliser des certificats pour s’authentifier auprès de ces services web.Now that you have one or more secured web services, your apps can use certificates to authenticate to those web services. Lorsque vous faites une demande à un service web authentifié à l’aide de l’objet HttpClient, la demande initiale ne contient pas de certificat client.When you make a request to an authenticated web service using the HttpClient object, the initial request will not contain a client certificate. Le service Web authentifié répond par une demande d’authentification du client.The authenticated web service will respond with a request for client authentication. Lorsque cela se produit, le client Windows interroge automatiquement le magasin de certificats au sujet des certificats clients disponibles.When this occurs, the Windows client will automatically query the certificate store for available client certificates. Votre utilisateur peut choisir l’un de ces certificats pour s’authentifier auprès du service Web.Your user can select from these certificates to authenticate to the web service. Certains certificats étant protégés par mot de passe, vous devez fournir à l’utilisateur un moyen d’entrer le mot de passe associé à un certificat.Some certificates are password protected, so you will need to provide the user with a way to input the password for a certificate.

Si aucun certificat client n’est disponible, l’utilisateur doit ajouter un certificat au magasin de certificats.If there are no client certificates available, then the user will need to add a certificate to the certificate store. Vous pouvez inclure dans votre application du code permettant à un utilisateur de sélectionner un fichier PFX contenant un certificat client, puis importer ce certificat dans le magasin de certificats clients.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.

Conseil    Vous pouvez utiliser makecert.exe pour créer un fichier PFX à utiliser avec ce guide de démarrage rapide.Tip  You can use makecert.exe to create a PFX file to use with this quickstart. Pour plus d’informations sur l’utilisation de makecert.exe, voir MakeCert.For information on using makecert.exe, see MakeCert.

 

  1. Ouvrez Visual Studio et créez un projet à partir de la page de démarrage.Open Visual Studio and create a new project from the start page. Nommez le nouveau projet « FirstContosoBankApp ».Name the new project "FirstContosoBankApp". Cliquez sur OK pour créer le projet.Click OK to create the new project.

  2. Dans le fichier MainPage.xaml, ajoutez le code XAML suivant à l’élément Grid par défaut.In the MainPage.xaml file, add the following XAML to the default Grid element. Ce code XAML comprend un bouton pour rechercher un fichier PFX à importer, une zone de texte pour entrer un mot de passe pour un fichier PFX protégé par mot de passe, un bouton pour importer un fichier PFX sélectionné, un bouton pour se connecter au service web sécurisé, ainsi qu’un bloc de texte pour afficher l’état de l’action actuelle.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. Enregistrez le fichier MainPage.xaml.Save the MainPage.xaml file.

  4. Dans le fichier MainPage.xaml.cs, ajoutez les instructions using suivantes :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. Dans le fichier MainPage.xaml.cs, ajoutez les variables suivantes à la classe MainPage.In the MainPage.xaml.cs file, add the following variables to the MainPage class. Celles-ci spécifient l’adresse de la méthode « Login » sécurisée de votre service web « FirstContosoBank ». Une variable globale détient aussi un certificat PFX à importer dans le magasin de certificats.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. Mettez à jour le <nom-serveur> à l’aide du nom complet de votre serveur 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. Dans le fichier MainPage.xaml.cs, ajoutez le gestionnaire de clic suivant pour le bouton et la méthode de connexion afin d’accéder au service web sécurisé.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. Dans le fichier MainPage.xaml.cs, ajoutez les gestionnaires de clic suivants pour le bouton pour rechercher un fichier PFX et le bouton afin d’importer un fichier PFX sélectionné dans le magasin de certificats.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. Exécutez votre application et établissez une connexion à votre service web sécurisé, et importez un fichier PFX dans le magasin de certificats local.Run your app and log in to your secured web service as well as import a PFX file into the local certificate store.

Vous pouvez utiliser ces étapes pour créer plusieurs applications utilisant le même certificat utilisateur pour accéder à des services web sécurisés identiques ou différents.You can use these steps to create multiple apps that use the same user certificate to access the same or different secured web services.