Freigabe von Zertifikaten zwischen AppsShare certificates between apps

UWP-Apps, die über eine Kombination aus Benutzer-ID und Kennwort hinaus eine sichere Authentifizierung benötigen, können Zertifikate für die Authentifizierung verwenden.Universal Windows Platform (UWP) apps that require secure authentication beyond a user Id and password combination can use certificates for authentication. Die Zertifikatauthentifizierung bietet eine hohe Vertrauenswürdigkeit bei der Benutzerauthentifizierung.Certificate authentication provides a high level of trust when authenticating a user. Es kann vorkommen, dass eine Gruppe von Diensten einen Benutzer für mehrere Apps authentifizieren möchte.In some cases, a group of services will want to authenticate a user for multiple apps. 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.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.

Apps können für die Authentifizierung bei einem Webdienst ein Zertifikat verwenden, und mehrere Apps können ein einzelnes Zertifikat aus dem Zertifikatspeicher verwenden, um denselben Benutzer zu authentifizieren.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. Falls im Speicher kein Zertifikat vorhanden ist, können Sie der App Code für den Import eines Zertifikats aus einer PFX-Datei hinzufügen.If a certificate does not exist in the store, you can add code to your app to import a certificate from a PFX file.

Aktivieren von Microsoft Internet Information Services (IIS) und ClientzertifikatszuordnungenEnable Microsoft Internet Information Services (IIS) and client certificate mapping

In diesem Artikel werden die Microsoft-Internetinformationsdienste (Microsoft Internet Information Services, IIS) als Beispiel verwendet.This article uses Microsoft Internet Information Services (IIS) for example purposes. IIS ist standardmäßig nicht aktiviert.IIS is not enabled by default. Sie können IIS über die Systemsteuerung aktivieren.You can enable IIS by using the Control Panel.

  1. Öffnen Sie die Systemsteuerung, und wählen Sie Programme aus.Open the Control Panel and select Programs.
  2. Wählen Sie Windows-Funktionen ein- oder ausschalten aus.Select Turn Windows features on or off.
  3. Erweitern Sie Internetinformationsdienste und dann WWW-Dienste.Expand Internet Information Services and then expand World Wide Web Services. Erweitern Sie Anwendungsentwicklungsfeatures, und wählen Sie ASP.NET 3.5 und ASP.NET 4.5.Expand Application Development Features and select ASP.NET 3.5 and ASP.NET 4.5. Das Auswählen führt dazu, dass Internetinformationsdienste automatisch aktiviert wird.Making these selections will automatically enable Internet Information Services.
  4. Klicken Sie auf OK, um die Änderungen zu übernehmen.Click OK to apply the changes.

Erstellen und Veröffentlichen eines sicheren WebdienstsCreate and publish a secured web service

  1. Führen Sie Microsoft Visual Studio als Administrator aus, und wählen Sie auf der Startseite die Option Neues Projekt aus.Run Microsoft Visual Studio as administrator and select New Project from the start page. Für die Veröffentlichung eines Webdiensts auf einem IIS-Server ist Administratorzugriff erforderlich.Administrator access is required to publish a web service to an IIS server. Ändern Sie im Dialogfeld „Neues Projekt“ das Framework in .NET Framework 3.5.In the New Project dialog, change the framework to .NET Framework 3.5. Wählen Sie Visual c# - > Web - > Visual Studio - > ASP.NET Webdienst Anwendungaus.Select Visual C# -> Web -> Visual Studio -> ASP.NET Web Service Application. Geben Sie der Anwendung den Namen „FirstContosoBank“.Name the application "FirstContosoBank". Klicken Sie auf OK, um das Projekt zu erstellen.Click OK to create the project.

  2. Ersetzen Sie in der Datei Service1.asmx.cs die standardmäßige Webmethode HelloWorld durch die folgende "Login"-Methode.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. Speichern Sie die Datei Service1.asmx.cs.Save the Service1.asmx.cs file.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die App "FirstContosoBank", und wählen Sie Veröffentlichen.In the Solution Explorer, right-click the "FirstContosoBank" app and select Publish.

  5. Erstellen Sie im Dialogfeld Web veröffentlichen ein neues Profil, und geben Sie ihm den Namen "ContosoProfile".In the Publish Web dialog, create a new profile and name it "ContosoProfile". Klicken Sie auf Weiter.Click Next.

  6. Geben Sie auf der nächsten Seite den Servernamen für Ihren IIS-Server ein, und geben Sie dann den Websitenamen "Standardwebsite/FirstContosoBank" an.On the next page, enter the server name for your IIS server, and specify a site name of "Default Web Site/FirstContosoBank". Klicken Sie auf Veröffentlichen, um den Webdienst zu veröffentlichen.Click Publish to publish your web service.

Konfigurieren des Webdiensts für die Verwendung der ClientzertifikatauthentifizierungConfigure your web service to use client certificate authentication

  1. Führen Sie den Internetinformationsdienste (IIS)-Manager aus.Run the Internet Information Services (IIS) Manager.
  2. Erweitern Sie die Websites für Ihren IIS-Server.Expand the sites for your IIS server. Wählen Sie unter Standardwebsite den neuen Webdienst "FirstContosoBank".Under the Default Web Site, select the new "FirstContosoBank" web service. Wählen Sie im Abschnitt Aktionen die Option Erweiterte Einstellungen....In the Actions section, select Advanced Settings....
  3. Legen Sie den Anwendungspool auf .NET v2.0 fest, und klicken Sie auf OK.Set the Application Pool to .NET v2.0 and click OK.
  4. Wählen Sie im Internetinformationsdienste (IIS)-Manager Ihren IIS-Server aus, und doppelklicken Sie anschließend auf Serverzertifikate.In the Internet Information Services (IIS) Manager, select your IIS server and then double-click Server Certificates. Wählen Sie im Abschnitt Aktionen die Option selbst signiertes Zertifikat erstellen... aus. Geben Sie "contosobank" als anzeigen Amen für das Zertifikat ein, und klicken Sie auf OK.In the Actions section, select Create Self-Signed Certificate.... Enter "ContosoBank" as the friendly name for the certificate and click OK. Es wird ein neues Zertifikat zur Verwendung durch den IIS-Server im Format „<Servername>.<Domänenname>“ erstellt.This will create a new certificate for use by the IIS server in the form of "<server-name>.<domain-name>".
  5. Wählen Sie im Internetinformationsdienste (IIS)-Manager die Standardwebsite aus.In the Internet Information Services (IIS) Manager, select the default web site. 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änen 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>"). Legen Sie das SSL-Zertifikat auf „ContosoBank“ fest.Set the SSL certificate to "ContosoBank". Klicken Sie auf OK.Click OK. Klicken Sie im Fenster Sitebindungen auf Schließen.Click Close in the Site Bindings window.
  6. Wählen Sie im Internetinformationsdienste (IIS)-Manager den Webdienst "FirstContosoBank" aus.In the Internet Information Services (IIS) Manager, select the "FirstContosoBank" web service. Doppelklicken Sie auf SSL-Einstellungen.Double-click SSL Settings. Aktivieren Sie SSL erforderlich.Check Require SSL. Wählen Sie unter Clientzertifikate die Option Erforderlich.Under Client certificates, select Require. Klicken Sie im Abschnitt Aktionen auf Übernehmen.In the Actions section, click Apply.
  7. Sie können überprüfen, ob der Webdienst richtig konfiguriert ist, indem Sie den Webbrowser öffnen und die folgende Webadresse eingeben: https://<server-name>.<domain-name>/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". Beispiel: „https://myserver.example.com/FirstContosoBank/Service1.asmx“.For example, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Wenn der Webdienst richtig konfiguriert ist, werden Sie zum Auswählen eines Clientzertifikats für den Zugriff auf den Webdienst aufgefordert.If your web service is configured correctly, you will be prompted to select a client certificate in order to access the web service.

Sie können diese Schritte wiederholen, um mehrere Webdienste zu erstellen, auf die mit demselben Clientzertifikat zugegriffen werden kann.You can repeat the previous steps to create multiple web services that can be accessed using the same client certificate.

Erstellen einer UWP-APP, die die Zertifikat Authentifizierung verwendetCreate a UWP app that uses certificate authentication

Nachdem Sie nun über mindestens einen sicheren Webdienst verfügen, können Ihre Apps Zertifikate für die Authentifizierung bei diesen Webdiensten verwenden.Now that you have one or more secured web services, your apps can use certificates to authenticate to those web services. Wenn Sie mithilfe des HttpClient-Objekts eine Anforderung an einen authentifizierten Webdienst senden, enthält die erste Anforderung kein Clientzertifikat.When you make a request to an authenticated web service using the HttpClient object, the initial request will not contain a client certificate. Der authentifizierte Webdienst antwortet mit einer Anforderung der Clientauthentifizierung.The authenticated web service will respond with a request for client authentication. Daraufhin fragt der Windows-Client den Zertifikatspeicher automatisch nach verfügbaren Clientzertifikaten ab.When this occurs, the Windows client will automatically query the certificate store for available client certificates. Der Benutzer kann für die Authentifizierung beim Webdienst eine Auswahl aus diesen Zertifikaten treffen.Your user can select from these certificates to authenticate to the web service. Da einige Zertifikate kennwortgeschützt sind, müssen Sie es Benutzern ermöglichen, das Kennwort für ein Zertifikat einzugeben.Some certificates are password protected, so you will need to provide the user with a way to input the password for a certificate.

Falls keine Clientzertifikate verfügbar sind, muss der Benutzer dem Zertifikatspeicher ein Zertifikat hinzufügen.If there are no client certificates available, then the user will need to add a certificate to the certificate store. Sie können Code in die App einfügen, der Benutzern die Auswahl einer PFX-Datei mit einem Clientzertifikat und das Importieren dieses Zertifikats in den Clientzertifikatspeicher ermöglicht.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.

Tipp    Sie können makecert.exe verwenden, um eine PFX-Datei zu erstellen, die mit diesem Schnellstart verwendet werden kann.Tip  You can use makecert.exe to create a PFX file to use with this quickstart. Informationen zur Verwendung von „makecert.exe“ finden Sie unter MakeCert.For information on using makecert.exe, see MakeCert.

 

  1. Öffnen Sie Visual Studio, und erstellen Sie auf der Startseite ein neues Projekt.Open Visual Studio and create a new project from the start page. Geben Sie dem neuen Projekt den Namen "FirstContosoBankApp".Name the new project "FirstContosoBankApp". Klicken Sie auf OK, um das neue Projekt zu erstellen.Click OK to create the new project.

  2. Fügen Sie in der Datei "MainPage.xaml" dem standardmäßigen Grid-Element den folgenden XAML-Code hinzu.In the MainPage.xaml file, add the following XAML to the default Grid element. Dieser XAML-Code enthält Folgendes: 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 sicheren Webdienst und einen Textblock zum Anzeigen des Zustands der aktuellen Aktion.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. Speichern Sie die Datei "MainPage.xaml".Save the MainPage.xaml file.

  4. Fügen Sie in der Datei "MainPage.xaml.cs" die folgenden using-Anweisungen hinzu: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. Fügen Sie in der Datei "MainPage.xaml.cs" der MainPage-Klasse die folgenden Variablen hinzu.In the MainPage.xaml.cs file, add the following variables to the MainPage class. Damit werden die Adresse für die sichere Login-Methode des Webdiensts „FirstContosoBank“ sowie eine globale Variable, die ein PFX-Zertifikat zum Importieren in den Zertifikatspeicher enthält, angegeben.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. Ersetzen Sie <Servername> durch den vollqualifizierten Servernamen Ihres IIS-Servers (Microsoft Internet Information Server).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. Fügen Sie in der Datei "MainPage.xaml.cs" den folgenden Klickhandler für die Anmeldeschaltfläche und -methode zum Zugreifen auf den sicheren Webdienst hinzu.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. Fügen Sie in der Datei „MainPage.xaml.cs“ die folgenden Klickhandler für die Schaltfläche zum Suchen nach einer PFX-Datei und die Schaltfläche zum Importieren einer ausgewählten PFX-Datei in den Zertifikatspeicher hinzu.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. Führen Sie Ihre App aus, und melden Sie sich beim sicheren Webdienst an. Importieren Sie eine PFX-Datei in den lokalen Zertifikatspeicher.Run your app and log in to your secured web service as well as import a PFX file into the local certificate store.

Mithilfe dieser Schritte können Sie mehrere Apps erstellen, für die dasselbe Benutzerzertifikat verwendet wird, um auf dieselben oder unterschiedliche sichere Webdienste zuzugreifen.You can use these steps to create multiple apps that use the same user certificate to access the same or different secured web services.