アプリ間での証明書の共有Share certificates between apps

ユーザー ID とパスワードの組み合わせよりも安全な認証を必要とするユニバーサル Windows プラットフォーム (UWP) アプリでは、証明書を認証に使うことができます。Universal Windows Platform (UWP) apps that require secure authentication beyond a user Id and password combination can use certificates for authentication. 証明書認証は、ユーザーの認証時に高レベルの信頼性を提供します。Certificate authentication provides a high level of trust when authenticating a user. 場合によっては、複数のアプリから複数のサービスのグループに対してユーザーを認証することがあります。In some cases, a group of services will want to authenticate a user for multiple apps. この記事では、1 つの証明書を使って複数のアプリを認証する方法と、セキュリティで保護された Web サービスにアクセスするための証明書をユーザーがインポートできる便利なコードを記述する方法について説明します。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.

アプリでは、証明書を使って Web サービスから認証を受けることができます。さらに、複数のアプリで証明書ストアにある 1 つの証明書を使って同じユーザーを認証できます。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. 証明書がストアに存在しない場合は、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.

Microsoft インターネット インフォメーション サービス (IIS) とクライアント証明書のマッピングの有効化Enable Microsoft Internet Information Services (IIS) and client certificate mapping

この記事では、例を示すために Microsoft インターネット インフォメーション サービス (IIS) を使用します。This article uses Microsoft Internet Information Services (IIS) for example purposes. IIS は、既定では有効になっていません。IIS is not enabled by default. IIS はコントロール パネルから有効にできます。You can enable IIS by using the Control Panel.

  1. コントロール パネルを開き、 [プログラム] を選びます。Open the Control Panel and select Programs.
  2. [Windows の機能の有効化または無効化] を選びます。Select Turn Windows features on or off.
  3. [インターネット インフォメーション サービス] を展開して、 [World Wide Web サービス] を展開します。Expand Internet Information Services and then expand World Wide Web Services. [アプリケーション開発機能] を展開して、 [ASP.NET 3.5][ASP.NET 4.5] を選びます。Expand Application Development Features and select ASP.NET 3.5 and ASP.NET 4.5. これらを選ぶと、自動的に [インターネット インフォメーション サービス] が有効になります。Making these selections will automatically enable Internet Information Services.
  4. [OK] をクリックして変更を適用します。Click OK to apply the changes.

セキュリティで保護された Web サービスの作成と発行Create and publish a secured web service

  1. 管理者として Microsoft Visual Studio を実行し、スタート ページで [新しいプロジェクト] を選びます。Run Microsoft Visual Studio as administrator and select New Project from the start page. Web サービスを IIS サーバーに発行するには、管理者のアクセス権が必要です。Administrator access is required to publish a web service to an IIS server. [新しいプロジェクト] ダイアログで、フレームワークを [.NET Framework 3.5] に変更します。In the New Project dialog, change the framework to .NET Framework 3.5. 選択Visual C# - > Web - > Visual Studio - > ASP.NET Web サービス アプリケーションします。Select Visual C# -> Web -> Visual Studio -> ASP.NET Web Service Application. アプリケーションに "FirstContosoBank" という名前を付けます。Name the application "FirstContosoBank". [OK] をクリックしてプロジェクトを作ります。Click OK to create the project.

  2. Service1.asmx.cs ファイルで、既定の HelloWorld Web メソッドを次の "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. Service1.asmx.cs ファイルを保存します。Save the Service1.asmx.cs file.

  4. ソリューション エクスプローラーで、"FirstContosoBank" アプリを右クリックし、 [発行] をクリックします。In the Solution Explorer, right-click the "FirstContosoBank" app and select Publish.

  5. [Web の発行] ダイアログで、新しいプロファイルを作って "ContosoProfile" という名前を付けます。In the Publish Web dialog, create a new profile and name it "ContosoProfile". [次へ].Click Next.

  6. 次のページで、IIS サーバーのサーバー名を入力し、"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". [発行] をクリックして Web サービスを発行します。Click Publish to publish your web service.

クライアント証明書認証を使うための Web サービスの構成Configure your web service to use client certificate authentication

  1. インターネット インフォメーション サービス (IIS) マネージャーを実行します。Run the Internet Information Services (IIS) Manager.
  2. IIS サーバーのサイトを展開します。Expand the sites for your IIS server. [Default Web Site] で、新しい "FirstContosoBank" Web サービスを選びます。Under the Default Web Site, select the new "FirstContosoBank" web service. [操作] セクションで、 [詳細設定] を選びます。In the Actions section, select Advanced Settings....
  3. [アプリケーション プール][.NET v2.0] に設定し、 [OK] をクリックします。Set the Application Pool to .NET v2.0 and click OK.
  4. インターネット インフォメーション サービス (IIS) マネージャーで、IIS サーバーを選んで [サーバー証明書] をダブルクリックします。In the Internet Information Services (IIS) Manager, select your IIS server and then double-click Server Certificates. [操作] セクションで、 [自己署名入り証明書の作成] を選びます。証明書のフレンドリ名として "ContosoBank" と入力し、 [OK] をクリックします。In the Actions section, select Create Self-Signed Certificate.... Enter "ContosoBank" as the friendly name for the certificate and click OK. これにより、IIS サーバーで使われる新しい証明書が "<サーバー名>.<ドメイン名>" の形式で作成されます。This will create a new certificate for use by the IIS server in the form of "<server-name>.<domain-name>".
  5. インターネット インフォメーション サービス (IIS) マネージャーで、既定の Web サイトを選びます。In the Internet Information Services (IIS) Manager, select the default web site. [操作] セクションで [バインド] を選び、 [追加] をクリックします。種類として "https" を選び、ポートを "443" に設定して、IIS サーバーの完全なホスト名 ("<サーバー名>.<ドメイン名>") を入力します。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>"). SSL 証明書を "ContosoBank" に設定します。Set the SSL certificate to "ContosoBank". [OK] をクリックします。Click OK. [サイト バインド] ウィンドウの [閉じる] をクリックします。Click Close in the Site Bindings window.
  6. インターネット インフォメーション サービス (IIS) マネージャーで、"FirstContosoBank" Web サービスを選びます。In the Internet Information Services (IIS) Manager, select the "FirstContosoBank" web service. [SSL 設定] をダブルクリックします。Double-click SSL Settings. [SSL が必要] をオンにします。Check Require SSL. [クライアント証明書][必要] を選びます。Under Client certificates, select Require. [操作] セクションで、 [適用] をクリックします。In the Actions section, click Apply.
  7. Web サービスが正しく構成されたことを確認するには、Web ブラウザーを開き、Web アドレスとして「 https://<サーバー名>.<ドメイン名>/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". たとえば、"https://myserver.example.com/FirstContosoBank/Service1.asmx" などです。For example, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Web サービスが正しく構成されていれば、Web サービスにアクセスするためのクライアント証明書を選ぶように求められます。If your web service is configured correctly, you will be prompted to select a client certificate in order to access the web service.

前の手順を繰り返すことで、同じクライアント証明書を使ってアクセスできる複数の Web サービスを作成できます。You can repeat the previous steps to create multiple web services that can be accessed using the same client certificate.

証明書認証を使う UWP アプリの作成Create a UWP app that uses certificate authentication

これでセキュリティで保護された Web サービスが 1 つ以上できたので、証明書を使ってこれらの Web サービスから認証を受けるアプリを作成できます。Now that you have one or more secured web services, your apps can use certificates to authenticate to those web services. HttpClient オブジェクトを使って認証 Web サービスへの要求を作成する場合、最初の要求にはクライアント証明書が含まれません。When you make a request to an authenticated web service using the HttpClient object, the initial request will not contain a client certificate. 認証 Web サービスは、応答としてクライアント認証を要求します。The authenticated web service will respond with a request for client authentication. この応答を受け取ると、Windows クライアントは自動的に証明書ストアを照会して、使用できるクライアント証明書を取得します。When this occurs, the Windows client will automatically query the certificate store for available client certificates. ユーザーは、これらの証明書の中から Web サービスへの認証に使うものを選ぶことができます。Your user can select from these certificates to authenticate to the web service. 証明書によってはパスワードで保護されていることがあるので、証明書のパスワードを入力するための手段をユーザーに提供する必要があります。Some certificates are password protected, so you will need to provide the user with a way to input the password for a certificate.

使用できるクライアント証明書がない場合は、ユーザーが証明書ストアに証明書を追加する必要があります。If there are no client certificates available, then the user will need to add a certificate to the certificate store. そこで、クライアント証明書の PFX ファイルをユーザーに選んでもらい、その証明書をクライアント証明書ストアにインポートするコードをアプリに含めることができます。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.

ヒント:   makecert.exe を使用して、このクイック スタートで使用する PFX ファイルを作成することができます。Tip  You can use makecert.exe to create a PFX file to use with this quickstart. makecert.exe の使い方の詳細については、「MakeCert」を参照してください。For information on using makecert.exe, see MakeCert.

 

  1. Visual Studio を開き、スタート ページで新しいプロジェクトを作成します。Open Visual Studio and create a new project from the start page. 新しいプロジェクトに "FirstContosoBankApp" という名前を付けます。Name the new project "FirstContosoBankApp". [OK] をクリックして新しいプロジェクトを作成します。Click OK to create the new project.

  2. MainPage.xaml ファイルで、次の XAML を既定の Grid 要素に追加します。In the MainPage.xaml file, add the following XAML to the default Grid element. この XAML には、インポートする PFX ファイルを参照するボタン、PFX ファイルがパスワードで保護されている場合にパスワードを入力するテキスト ボックス、選んだ PFX ファイルをインポートするボタン、セキュリティで保護された Web サービスにログインするボタン、現在の操作の状態を表示するテキスト ブロックが含まれています。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. MainPage.xaml ファイルを保存します。Save the MainPage.xaml file.

  4. MainPage.xaml.cs ファイルに、次の 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. MainPage.xaml.cs ファイルで、次の変数を MainPage クラスに追加します。In the MainPage.xaml.cs file, add the following variables to the MainPage class. ここでは、"FirstContosoBank" Web サービスのセキュリティで保護された "Login" メソッドのアドレスと、証明書ストアにインポートする PFX 証明書を保持するグローバル変数を指定しています。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. <サーバー名> は Microsoft Internet Information (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. MainPage.xaml.cs ファイルで、次に示すように、ログイン ボタンのクリック ハンドラーと、セキュリティで保護された Web サービスにアクセスするためのメソッドを追加します。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. MainPage.xaml.cs ファイルで、次に示すように、PFX ファイルを参照するボタンのクリック ハンドラーと、選ばれた PFX ファイルを証明書ストアにインポートするボタンのクリック ハンドラーを追加します。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. アプリを実行し、セキュリティで保護された Web サービスにログインして、PFX ファイルをローカル証明書ストアにインポートします。Run your app and log in to your secured web service as well as import a PFX file into the local certificate store.

これらの手順を繰り返すことで、同じユーザー証明書を使ってセキュリティで保護された同じ Web サービスや別の Web サービスにアクセスする複数のアプリを作成できます。You can use these steps to create multiple apps that use the same user certificate to access the same or different secured web services.