認証されたメッセージを Windows Phone プッシュ通知サービスに送信する方法

原文の記事の投稿日: 2012 年 6 月 5 日 (火曜日)

プッシュ通知サービスは、Windows Phone アプリケーションでトースト メッセージの送信や Live タイルの更新といった操作ができる、Windows Phone の便利な機能です。このサービスは転送セキュリティ プロトコルを一切追加しなくても使用できますが、その場合はメッセージ数が 1 日につき最大 500 に制限されます。ただし、SSL を使用して、相互に認証されたセッションをプッシュ通知サービスに設定する場合は、送信できるメッセージ数の制限がなくなります。これにより、会話のセキュリティ保護はずっと魅力的なものになります。その作業を行う実際のプロセスに関するドキュメントは、これまで私が見てきた限り、残念ながらどれも十分なものではありませんでした。幸い、Windows Phone App Hub 内のソーシャル フォーラムは非常に有用であり、それらのフォーラムを読破すれば作業の全容を把握できます。しかし、作業に必要なすべての情報を探し出す時間を節約するために、ここではそれらを 1 つの簡単なドキュメントにまとめました。本来、こうした情報は製品チームなどにまとめてもらいたいのですが、とにかく参考にしてください。

  1. こうしたセキュリティで保護された通信の確立に使用される証明書の要件については、https://msdn.microsoft.com/ja-jp/library/ff941099(VS.92).aspx を参照してください。ただし、作業を簡単にするために、サポートされている証明機関の 1 つによる SSL 証明書がある場合は、その証明書を使用できることがわかりました。サポートされている証明機関の一覧については、https://msdn.microsoft.com/ja-jp/library/gg521150(VS.92).aspx を参照してください。
  2. この証明書を取得して App Hub にアップロードする必要があります。必要なのは、秘密キーを伴う PFX ではなく、パブリック版の証明書 (.cer ファイル) です。そのアップロードを行うには、App Hub に署名し、サインインを行った後、左上隅にあるアカウント名をクリックします。アカウント管理のページに進むと、[マイ アカウント] バナーの下に "証明書" というリンクが表示されています。このリンクをクリックし、表示される指示に従って証明書をアップロードします。
  3. Windows Phone アプリケーションでは、HttpNotificationChannel クラスのインスタンスを作成します。新しい HttpNotificationChannel の作成時には、SSL 証明書の共通名 (CN) を新しいチャネルの 2 番目のパラメーターとして使用します。証明書の共通名は、.cer ファイルをダブルクリックして開き、[詳細] タブをクリックして、Subject プロパティをクリックするとわかります。値が以下のウィンドウに表示されます。最初のものは "CN = www.contoso.com" のようになっており、この例では "www.contoso.com" の部分を使用します。そのため、新しいチャネルを作成する場合は、pushChannel = new HttpNotificationChannel("myChannelName", "www.contoso.com"); のようになります。
    1. 注意: 既に各種デバイス用にチャネルを作成している場合は、HttpNotificationChannel.Find メソッドを使用して該当するチャネルを探し、そのチャネルに対する .Close および .Dispose の操作を行います。その後、共通名を接続に割り当てることができるように、チャネルを再作成する必要があります。
  4. サーバー側のコードを実行する場所には、秘密キーを含む証明書 (.pfx ファイル) をインストールする必要があります。また、アプリケーション プールのアカウントがその証明書の秘密キーにアクセスできるようにする必要もあります。そのためには、MMC ツールを開き、ローカル コンピューターの証明書スナップインを追加します。証明書を個人用ノードにインストールした後、MMC でその証明書を右クリックし、[すべてのタスク]、[秘密キーの管理] の順に選択します。その後、アプリケーションで使用しているアプリケーション プールのアカウントを追加し、少なくともキーに対する読み取りの権限をそのアカウントに与える必要があります。
    1. 注意: IIS 7.5 で新しいビルトイン アカウント (ApplicationPoolIdentity など) を使用する場合は、IIS apppool\ASP.NET v4.0 ("ASP.NET v4.0" はアプリケーション プールの名前) に対するアクセス権を与える必要があります。
  5. プッシュ通知サービスにメッセージを送信するコードでは、HttpWebRequest オブジェクトに証明書を追加する必要があります。通常、この操作を行うには、X509 ストアを開き、個人用ストアの証明書コレクションを取得して、コレクションに対する検索を拇印によって実行 (その際、証明書のプロパティから証明書の拇印をコピーしてコードに貼り付ける必要があります) したうえで、コードが返すコレクション (myCollection[0]) 内の最初の証明書を使用します。取得した証明書は、myRequest..ClientCertificates.Add(mySslCertificate); のようにして要求に追加できます。

その他の重要事項:

  • アップロードした証明書は、4 か月しか使用されません。その証明書を使用しているマーケットプレースに認定用のアプリケーションを送信していない場合は、証明書のアップロードが再び必要になります。認定用のアプリケーションをマーケットプレースに送信すると、アップロードした証明書の一覧から、そのアプリケーションの証明書を選択する機会が与えられます。その場合は、こうした通信のためにアップロードした証明書を選択するだけで、設定が行われます。
  • ここで述べた方法でうまくいくことを確認するにはどうすればよいでしょうか。Windows Phone クライアントで HttpNotificationChannel クラスのインスタンスを作成すると、メッセージの送信先となる通知チャネルの URI が返されます。この URI を調べてください。認証された接続を使用していない場合は、パスに "throttledthirdparty" という文字列が含まれています。一方、クラスのインスタンスを正しく作成した場合は、パスに "unthrottledthirdparty" という文字列が含まれています。また、パスに表示されているプロトコルは HTTP ではなく、HTTPS になります。もちろん、本当に正しく機能することを確認するには、URI の取得後にメッセージの送信が正常に行われる必要があります。メッセージが問題なくデバイスに届けば、正しく機能したことがわかります。

これはローカライズされたブログ投稿です。原文の記事は、「How To Send An Authenticated Message to the Windows Phone Push Notification Service」をご覧ください。