Freigeben von Zertifikaten zwischen Apps

Universelle Windows-Plattform(UWP)-Apps, die eine sichere Authentifizierung über eine Benutzer-ID- und Kennwortkombination hinaus erfordern, können Zertifikate für die Authentifizierung verwenden. Die Zertifikatauthentifizierung bietet eine hohe Vertrauenswürdigkeit bei der Benutzerauthentifizierung. Es kann vorkommen, dass eine Gruppe von Diensten einen Benutzer für mehrere Apps authentifizieren möchte. In diesem Artikel wird gezeigt, wie Sie mehrere Apps mit demselben Zertifikat authentifizieren und für einen Benutzer geeigneten Code zum Importieren eines Zertifikats bereitstellen können, das für den Zugriff auf sichere Webdienste bestimmt ist.

Apps können sich mit einem Zertifikat bei einem Webdienst authentifizieren, und mehrere Apps können ein einzelnes Zertifikat aus dem Zertifikatspeicher verwenden, um denselben Benutzer zu authentifizieren. Wenn kein Zertifikat im Speicher vorhanden ist, können Sie Ihrer App Code hinzufügen, um ein Zertifikat aus einer PFX-Datei zu importieren.

Aktivieren der Microsoft-Internetinformationsdienste (IIS) und der Clientzertifikatzuordnung

In diesem Artikel werden z. B. Microsoft-Internetinformationsdienste (IIS) verwendet. IIS ist standardmäßig nicht aktiviert. Sie können IIS mithilfe der Systemsteuerung aktivieren.

  1. Öffnen Sie die Systemsteuerung, und wählen Sie "Programme" aus.
  2. Wählen Sie Windows Funktionen ein- oder ausschalten.
  3. Erweitern Sie Internetinformationsdienste, und erweitern Sie dann World Wide Web Services. Erweitern Sie die Anwendungsentwicklungsfeatures , und wählen Sie ASP.NET 3.5 und ASP.NET 4.5 aus. Wenn Sie diese Auswahl treffen, werden Internetinformationsdienste automatisch aktiviert.
  4. Klicken Sie auf "OK ", um die Änderungen anzuwenden.

Erstellen und Veröffentlichen eines gesicherten Webdiensts

  1. Führen Sie Microsoft Visual Studio als Administrator aus, und wählen Sie auf der Startseite "Neues Projekt " aus. Der Administratorzugriff ist erforderlich, um einen Webdienst auf einem IIS-Server zu veröffentlichen. Ändern Sie im Dialogfeld "Neues Projekt" das Framework in .NET Framework 3.5. Wählen Sie Visual C# -Web ->>Visual Studio ->ASP.NET Webdienstanwendung aus. Nennen Sie die Anwendung "FirstContosoBank". Klicken Sie auf OK, um das Projekt zu erstellen.

  2. Ersetzen Sie in der datei Service1.asmx.cs die standardmäßige HelloWorld-Webmethode durch die folgende "Login"-Methode.

            [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. Speichern Sie die Service1.asmx.cs Datei.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die App "FirstContosoBank", und wählen Sie "Veröffentlichen" aus.

  5. Erstellen Sie im Dialogfeld "Web veröffentlichen" ein neues Profil, und nennen Sie es "ContosoProfile". Klicken Sie auf Weiter.

  6. Geben Sie auf der nächsten Seite den Servernamen für Ihren IIS-Server ein, und geben Sie den Websitenamen "Standardwebsite/FirstContosoBank" an. Klicken Sie auf "Veröffentlichen ", um Ihren Webdienst zu veröffentlichen.

Konfigurieren Des Webdiensts für die Verwendung der Clientzertifikatauthentifizierung

  1. Führen Sie den Internetinformationsdienste-Manager (IIS) aus.
  2. Erweitern Sie die Websites für Ihren IIS-Server. Wählen Sie auf der Standardwebsite den neuen Webdienst "FirstContosoBank" aus. Wählen Sie im Abschnitt "Aktionen " die Option "Erweiterte Einstellungen..." aus.
  3. Legen Sie den Anwendungspool auf .NET v2.0 fest, und klicken Sie auf 'OK'.
  4. Wählen Sie im Internetinformationsdienste-Manager (IIS) Ihren IIS-Server aus, und doppelklicken Sie dann auf Serverzertifikate. Wählen Sie im Abschnitt "Aktionen " die Option "Selbstsigniertes Zertifikat erstellen" aus. Geben Sie "ContosoBank" als Anzeigenamen für das Zertifikat ein, und klicken Sie auf "OK". Dadurch wird ein neues Zertifikat für die Verwendung durch den IIS-Server in Form von "<Servername>" erstellt.<Domain-Name>".
  5. Wählen Sie im Internetinformationsdienste-Manager (IIS) die Standardwebsite aus. Wählen Sie im Abschnitt "Aktionen " die Option "Bindung" aus, und klicken Sie dann auf "Hinzufügen...". Wählen Sie "https" als Typ aus, legen Sie den Port auf "443" fest, und geben Sie den vollständigen Hostnamen für Ihren IIS-Server ein ("<Servername>").<Domänenname>"). Legen Sie das SSL-Zertifikat auf "ContosoBank" fest. Klicken Sie auf OK. Klicken Sie im Fenster "Websitebindungen" auf "Schließen".
  6. Wählen Sie im Internetinformationsdienste-Manager (IIS) den Webdienst "FirstContosoBank" aus. Doppelklicken Sie auf SSL-Einstellungen. Überprüfen Sie SSL. Wählen Sie unter "Clientzertifikate" die Option "Erforderlich" aus. Klicken Sie im Abschnitt "Aktionen " auf "Übernehmen".
  7. Sie können überprüfen, ob der Webdienst ordnungsgemäß konfiguriert ist, indem Sie Ihren Webbrowser öffnen und die folgende Webadresse eingeben: "https://< Servername>.<domain-name>/FirstContosoBank/Service1.asmx". Beispiel: "https://myserver.example.com/FirstContosoBank/Service1.asmx". Wenn Ihr Webdienst ordnungsgemäß konfiguriert ist, werden Sie aufgefordert, ein Clientzertifikat auszuwählen, um auf den Webdienst zuzugreifen.

Sie können die vorherigen Schritte wiederholen, um mehrere Webdienste zu erstellen, auf die mit demselben Clientzertifikat zugegriffen werden kann.

Erstellen einer UWP-App, die die Zertifikatauthentifizierung verwendet

Nachdem Sie nun über einen oder mehrere gesicherte Webdienste verfügen, können Ihre Apps Zertifikate verwenden, um sich bei diesen Webdiensten zu authentifizieren. Wenn Sie eine Anforderung an einen authentifizierten Webdienst mithilfe des HttpClient-Objekts stellen, enthält die ursprüngliche Anforderung kein Clientzertifikat. Der authentifizierte Webdienst antwortet mit einer Anforderung für die Clientauthentifizierung. In diesem Fall fragt der Windows-Client automatisch den Zertifikatspeicher nach verfügbaren Clientzertifikaten ab. Ihr Benutzer kann aus diesen Zertifikaten auswählen, um sich beim Webdienst zu authentifizieren. Einige Zertifikate sind kennwortgeschützter, daher müssen Sie dem Benutzer eine Möglichkeit geben, das Kennwort für ein Zertifikat einzugeben.

Wenn keine Clientzertifikate verfügbar sind, muss der Benutzer dem Zertifikatspeicher ein Zertifikat hinzufügen. Sie können Code in Ihre App einfügen, mit dem ein Benutzer eine PFX-Datei auswählen kann, die ein Clientzertifikat enthält, und dann dieses Zertifikat in den Clientzertifikatspeicher importieren kann.

Tipp : Sie können makecert.exe verwenden, um eine PFX-Datei zu erstellen, die mit dieser Schnellstartanleitung verwendet werden kann. Informationen zur Verwendung von makecert.exe finden Sie unter MakeCert.

 

  1. Öffnen Sie Visual Studio, und erstellen Sie ein neues Projekt auf der Startseite. Nennen Sie das neue Projekt "FirstContosoBankApp". Klicken Sie auf OK, um das neue Projekt zu erstellen.

  2. Fügen Sie in der Datei "MainPage.xaml" dem Standardmäßigen Grid-Element den folgenden XAML-Code hinzu. Dieser XAML-Code enthält eine Schaltfläche zum Suchen nach einer zu importierenden PFX-Datei, ein Textfeld zum Eingeben eines Kennworts für eine kennwortgeschützte PFX-Datei, eine Schaltfläche zum Importieren einer ausgewählten PFX-Datei, eine Schaltfläche zum Anmelden beim gesicherten Webdienst und einen Textblock zum Anzeigen des Status der aktuellen Aktion.

    <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. Speichern Sie die Datei "MainPage.xaml".

  4. Fügen Sie in der datei MainPage.xaml.cs die folgenden using-Anweisungen hinzu.

    using Windows.Web.Http;
    using System.Text;
    using Windows.Security.Cryptography.Certificates;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    using Windows.Storage.Streams;
    
  5. Fügen Sie in der datei MainPage.xaml.cs die folgenden Variablen zur MainPage-Klasse hinzu. Sie geben die Adresse für die gesicherte "Login"-Methode Ihres "FirstContosoBank"-Webdiensts und eine globale Variable an, die ein PFX-Zertifikat enthält, das in den Zertifikatspeicher importiert werden soll. Aktualisieren Sie den <Servernamen> auf den vollqualifizierten Servernamen für Ihren Iis-Server (Internet Information Server).

    private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    private string pfxCert = null;
    
  6. Fügen Sie in der datei MainPage.xaml.cs den folgenden Klickhandler für die Anmeldeschaltfläche und -methode hinzu, um auf den gesicherten Webdienst zuzugreifen.

    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. Fügen Sie in der datei MainPage.xaml.cs die folgenden Klickhandler für die Schaltfläche hinzu, um nach einer PFX-Datei und der Schaltfläche zum Importieren einer ausgewählten PFX-Datei in den Zertifikatspeicher zu suchen.

    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. Führen Sie Ihre App aus, und melden Sie sich bei Ihrem gesicherten Webdienst an, und importieren Sie eine PFX-Datei in den lokalen Zertifikatspeicher.

Mit diesen Schritten können Sie mehrere Apps erstellen, die dasselbe Benutzerzertifikat verwenden, um auf dieselben oder unterschiedliche gesicherte Webdienste zuzugreifen.