Holographic Remoting と Windows Mixed Reality API を使用したセキュリティで保護された接続
接続セキュリティを有効にする場合は、カスタム リモート アプリとプレーヤー アプリを実装する必要があります。 提供されているサンプルは、独自のアプリの開始点として使用できます。
セキュリティを有効にするには、 ではなく Listen()
を呼び出ListenSecure()
し、ConnectSecure()
リモートConnect()
処理接続を確立します。
これらの呼び出しでは、セキュリティ関連の情報を提供および検証するために、特定のインターフェイスの実装を提供する必要があります。
- サーバーは、証明書プロバイダーと認証検証コントロールを実装する必要があります
- クライアントは、認証プロバイダーと証明書検証コントロールを実装する必要があります。
すべてのインターフェイスには、コールバック オブジェクトをパラメーターとして受け取るアクションの実行を要求する関数があります。 このオブジェクトを使用すると、要求の非同期処理を簡単に実装できます。 このオブジェクトへの参照を保持し、非同期アクションが完了したら完了関数を呼び出します。 完了関数は、任意のスレッドから呼び出される場合があります。
ヒント
WinRT インターフェイスの実装は、C++/WinRT を使用して簡単に行うことができます。 C++/WinRT を使用した Author API の章では、これについて詳しく説明しています。
重要
build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl
NuGet パッケージ内には、セキュリティで保護された接続に関連する API の詳細なドキュメントが含まれています。
証明書プロバイダーの実装
証明書プロバイダーは、使用する証明書をサーバー アプリケーションに提供します。 実装は、次の 2 つの部分で構成されます。
インターフェイスを実装する
ICertificate
証明書オブジェクト。GetCertificatePfx()
は、証明書ストアのバイナリ コンテンツをPKCS#12
返す必要があります。 ファイルには.pfx
データがPKCS#12
含まれているため、その内容はここで直接使用できます。GetSubjectName()
は、使用する証明書を識別するフレンドリ名を返す必要があります。 証明書にフレンドリ名が割り当てられていない場合、この関数は証明書のサブジェクト名を返す必要があります。GetPfxPassword()
は、証明書ストアを開くために必要なパスワード (またはパスワードが必要ない場合は空の文字列) を返す必要があります。
インターフェイスを実装する
ICertificateProvider
証明書プロバイダー:GetCertificate()
は、証明書オブジェクトを構築し、コールバック オブジェクトで を呼び出CertificateReceived()
して返す必要があります。
認証検証コントロールの実装
認証検証コントロールは、クライアントから送信された認証トークンを受け取り、検証結果で応答します。
インターフェイスを IAuthenticationReceiver
次のように実装します。
GetRealm()
は、認証領域の名前 (リモート処理接続ハンドシェイク中に使用される HTTP 領域) を返す必要があります。ValidateToken()
は、クライアント認証トークンを検証し、検証結果を使用してコールバック オブジェクトで を呼び出すValidationCompleted()
必要があります。
認証プロバイダーの実装
認証プロバイダーは、サーバーに送信される認証トークンを生成または取得します。
インターフェイスを IAuthenticationProvider
次のように実装します。
GetToken()
は、送信する認証トークンを生成または取得する必要があります。 トークンの準備ができたら、コールバック オブジェクトでTokenReceived()
メソッドを呼び出します。
証明書検証コントロールの実装
証明書検証コントロールは、サーバーによって送信された証明書チェーンを受け取り、サーバーを信頼できるかどうかを判断します。
証明書を検証するには、基になるシステムの検証ロジックを使用できます。 このシステム検証では、独自の検証ロジックをサポートするか、完全に置き換えることができます。 セキュリティで保護された接続を要求するときに独自の証明書検証コントロールを渡さない場合は、システム検証が自動的に使用されます。
Windows では、システム検証は次のチェックされます。
- 証明書チェーンの整合性: 証明書は、信頼されたルート証明書で終わる一貫性のあるチェーンを形成します
- 証明書の有効性: サーバーの証明書は有効期間内にあり、サーバー認証用に発行されます
- 失効: 証明書が取り消されていません
- 名前の一致: サーバーのホスト名は、証明書が発行されたホスト名の 1 つと一致します
インターフェイスを ICertificateValidator
次のように実装します。
PerformSystemValidation()
は、上記のようにシステム検証を実行する必要がある場合は を返すtrue
必要があります。 この場合、システム検証結果は メソッドへのValidateCertificate()
入力として渡されます。ValidateCertificate()
は、証明書チェーンを検証し、最後の検証結果で渡されたコールバックで を呼び出すCertificateValidated()
必要があります。 このメソッドは、証明書チェーン、接続が確立されているサーバーの名前、および失効チェックを強制する必要があるかどうかを受け入れます。 証明書チェーンに複数の証明書が含まれている場合、最初の証明書はサブジェクト証明書です。
Note
ユース ケースで別の形式の検証が必要な場合 (上記の証明書のユース ケース #1 を参照)、システム検証を完全にバイパスします。 代わりに、DER でエンコードされた X.509 証明書を処理できる任意の API またはライブラリを使用して、証明書チェーンをデコードし、ユース ケースに必要なチェックを実行します。