Partager via


Partager des certificats entre applications

les applications plateforme Windows universelle (UWP) qui nécessitent une authentification sécurisée au-delà d’une combinaison d’ID d’utilisateur et de mot de passe peuvent utiliser des certificats pour l’authentification. L’authentification par certificat permet d’authentifier un utilisateur avec un niveau de confiance élevé. Dans certains cas, un groupe de services peut authentifier un utilisateur pour plusieurs applications. 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.

Les applications peuvent s’authentifier auprès d’un service web à l’aide d’un certificat, et plusieurs applications peuvent utiliser un certificat unique à partir du magasin de certificats pour authentifier le même utilisateur. 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.

Activer le mappage de certificat client et IIS (Microsoft Internet Information Services)

Cet article utilise Microsoft Internet Information Services (IIS) à des fins d’exemple. IIS n’est pas activé par défaut. Vous pouvez activer IIS à l’aide du Panneau de configuration.

  1. Ouvrez le Panneau de configuration et sélectionnez Programmes.
  2. Sélectionnez Activer ou désactiver des fonctionnalités Windows.
  3. Développez Internet Information Services , puis développez World Wide Web Services. Développez les fonctionnalités de développement d’applications et sélectionnez ASP.NET 3.5 et ASP.NET 4.5. La création de ces sélections active automatiquement les services Internet Information Services.
  4. Cliquez sur OK pour appliquer les modifications.

Créer et publier un service web sécurisé

  1. Exécutez Microsoft Visual Studio en tant qu’administrateur et sélectionnez Nouveau projet dans la page de démarrage. L’accès administrateur est requis pour publier un service web sur un serveur IIS. Dans la boîte de dialogue Nouveau projet, remplacez le framework par .NET Framework 3.5. Sélectionnez Visual C# ->Web ->Visual Studio ->ASP.NET application de service web. Nommez l’application « FirstContosoBank ». Cliquez sur OK pour créer le projet.

  2. Dans le fichier Service1.asmx.cs, remplacez la méthode web HelloWorld par défaut par la méthode « Login » suivante.

            [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 .

  4. Dans le Explorateur de solutions, cliquez avec le bouton droit sur l’application « FirstContosoBank », puis sélectionnez Publier.

  5. Dans la boîte de dialogue Publier le web , créez un profil et nommez-le « ContosoProfile ». Sélectionnez Suivant.

  6. Dans la page suivante, entrez le nom du serveur IIS et spécifiez le nom du site « Site web par défaut/FirstContosoBank ». Cliquez sur Publier pour publier votre service web.

Configurer votre service web pour utiliser l’authentification par certificat client

  1. Exécutez le Gestionnaire des services Internet (IIS).
  2. Développez les sites de votre serveur IIS. Sous le site web par défaut, sélectionnez le nouveau service web « FirstContosoBank ». Dans la section Actions , sélectionnez Paramètres avancés....
  3. Définissez le pool d’applications sur .NET v2.0 , puis cliquez sur OK.
  4. Dans le Gestionnaire des services Internet (IIS), sélectionnez votre serveur IIS, puis double-cliquez sur Certificats de serveur. Dans la section Actions , sélectionnez Créer un certificat auto-signé.... Entrez « ContosoBank » comme nom convivial pour le certificat, puis cliquez sur OK. Cela crée un certificat à utiliser par le serveur IIS sous la forme de «< nom> de serveur ».<nom de> domaine ».
  5. Dans le Gestionnaire des services Internet (IIS), sélectionnez le site web par défaut. 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 («< nom> du serveur ».<domain-name>"). Définissez le certificat SSL sur « ContosoBank ». Cliquez sur OK. Cliquez sur Fermer dans la fenêtre Liaisons de site.
  6. Dans le Gestionnaire des services Internet (IIS), sélectionnez le service web « FirstContosoBank ». Double-cliquez sur Paramètres SSL. Vérifiez exiger SSL. Sous Certificats clients, sélectionnez Exiger. Dans la section Actions , cliquez sur Appliquer.
  7. Vous pouvez vérifier que le service web est configuré correctement en ouvrant votre navigateur web et en entrant l’adresse web suivante : « https://< server-name>.<domain-name>/FirstContosoBank/Service1.asmx ». Par exemple : "https://myserver.example.com/FirstContosoBank/Service1.asmx". Si votre service web est configuré correctement, vous serez invité à sélectionner un certificat client pour accéder au service web.

Vous pouvez répéter les étapes précédentes pour créer plusieurs services web accessibles à l’aide du même certificat client.

Créer une application UWP qui utilise l’authentification par certificat

Maintenant que vous disposez d’un ou plusieurs services web sécurisés, vos applications peuvent utiliser des certificats pour s’authentifier auprès de ces services web. Lorsque vous effectuez une demande à un service web authentifié à l’aide de l’objet HttpClient , la requête initiale ne contient pas de certificat client. Le service web authentifié répond avec une demande d’authentification du client. Lorsque cela se produit, le client Windows interroge automatiquement le magasin de certificats pour les certificats clients disponibles. Votre utilisateur peut sélectionner parmi ces certificats pour s’authentifier auprès du service web. Certains certificats sont protégés par mot de passe. Vous devez donc fournir à l’utilisateur un moyen d’entrer le mot de passe d’un certificat.

S’il n’existe aucun certificat client disponible, l’utilisateur doit ajouter un certificat au magasin de certificats. Vous pouvez inclure du code dans votre application qui permet à un utilisateur de sélectionner un fichier PFX qui contient un certificat client, puis d’importer ce certificat dans le magasin de certificats client.

Conseil : vous pouvez utiliser makecert.exe pour créer un fichier PFX à utiliser avec ce guide de démarrage rapide. Pour plus d’informations sur l’utilisation de makecert.exe, consultez MakeCert.

 

  1. Ouvrez Visual Studio et créez un projet à partir de la page de démarrage. Nommez le nouveau projet « FirstContosoBankApp ». Cliquez sur OK pour créer le projet.

  2. Dans le fichier MainPage.xaml, ajoutez le code XAML suivant à l’élément Grid par défaut. Ce code XAML inclut un bouton permettant de 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 permettant d’importer un fichier PFX sélectionné, un bouton permettant de se connecter au service web sécurisé et un bloc de texte pour afficher l’état de l’action actuelle.

    <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.

  4. Dans le fichier MainPage.xaml.cs, ajoutez les instructions using suivantes.

    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 . Ils spécifient l’adresse de la méthode « Login » sécurisée de votre service web « FirstContosoBank » et une variable globale qui contient un certificat PFX à importer dans le magasin de certificats. Mettez à jour le <nom> du serveur avec le nom de serveur complet de votre serveur Microsoft Internet Information Server (IIS).

    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 clics suivant pour le bouton de connexion et la méthode permettant d’accéder au service web sécurisé.

    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 clics suivants pour le bouton pour rechercher un fichier PFX et le bouton pour importer un fichier PFX sélectionné dans le magasin de certificats.

    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();
    }
    
  8. Exécutez votre application et connectez-vous à votre service web sécurisé, ainsi que l’importation d’un fichier PFX dans le magasin de certificats local.

Vous pouvez utiliser ces étapes pour créer plusieurs applications qui utilisent le même certificat d’utilisateur pour accéder au même ou à différents services web sécurisés.