Cómo enviar un mensaje autenticado a los Servicios de notificaciones de inserción de un Windows Phone

Artículo original publicado el martes, 5 de junio de 2012

Los Servicios de notificaciones de inserción son una característica muy interesante del Windows Phone que te permite enviar mensajes de aviso, actualizar un mosaico dinámico, etc. para tu aplicación de Windows Phone. Puedes utilizar el sistema sin ningún protocolo de seguridad de transmisión adicional, pero, en tal caso, tendrás un límite máximo de 500 mensajes al día. No obstante, si usas SSL para configurar una sesión autenticada de forma recíproca en los Servicios de notificaciones de inserción, podrás enviar un número ilimitado de mensajes. De este modo, resulta mucho más interesante proteger una conversación. Desafortunadamente, el proceso real para ello está muy deficientemente documentado. Por fortuna, en los útiles foros sociales del App Hub de Windows Phone puedes encontrar todas las partes necesarias para comprender este proceso. Para ahorrarte algo de tiempo en la búsqueda de estas partes, he decidido reunirlas todas aquí en un sencillo documento. Más o menos lo que debería haber hecho el equipo de producto. :-) Aquí lo tienes:

  1. Aquí puedes conocer los requisitos necesarios del certificado que se usa para establecer esta comunicación segura: https://msdn.microsoft.com/es-es/library/ff941099(v=vs.92). No obstante, para simplificarlo, he observado que si tienes un certificado SSL de una de las entidades de certificación admitidas, también funciona bien. Para ver la lista de entidades de certificación admitidas, haz clic aquí: https://msdn.microsoft.com/es-es/library/gg521150(v=vs.92).
  2. Debes cargar este certificado en el App Hub. No se necesita el PFX con la clave privada, únicamente la versión pública del certificado (es decir, el archivo .cer). Para cargarlo, regístrate en el App Hub, inicia sesión y, a continuación, haz clic en tu nombre de cuenta en la esquina superior izquierda. Cuando se abra la página de administración de la cuenta, verás un vínculo llamado Certificados bajo la pancarta Mi cuenta. Haz clic en ese vínculo y sigue las instrucciones que se ofrecen para cargar el certificado.
  3. En tu aplicación de Windows Phone, crea una instancia de clase HttpNotificationChannel. Tras crear la nueva HttpNotificationChannel, usa el nombre común (CN) del certificado SSL como segundo parámetro para el nuevo canal. Para encontrar el nombre común de tu certificado, haz doble clic en la parte superior del archivo .cer para abrirlo, haz clic en la pestaña Detalles y, a continuación, haz clic en la propiedad Asunto. Verás que en la ventana de abajo se muestran valores y el primero de ellos debe ser similar a "CN = www.contoso.com"; ("www.contoso.com" solo se debe usar para este ejemplo). De este modo, el nuevo canal que has creado tendrá un aspecto similar a: pushChannel = new HttpNotificationChannel("myChannelName", "www.contoso.com");
    1. NOTA: si ya has creado canales para distintos dispositivos, deberás encontrar tu canal mediante el método HttpNotificationChannel.Find, a continuación .Close y, finalmente, .Dispose para desechar el canal. A continuación, deberás volver a crearlo para que puedas asociar tu nombre común con la conexión.
  4. Donde ejecutes el código del lado servidor, debes instalar el certificado, incluida la clave privada (el archivo .pfx). También debes asegurarte de que la cuenta para tu grupo de aplicaciones tiene acceso a las claves privadas para ese certificado. Para ello, abre la herramienta MMC y agrega el complemento Certificados para el equipo local. Tras instalar tu certificado en el nodo Personal, haz clic con el botón secundario en el certificado en el MMC y selecciona Todas las tareas...Administrar claves privadas. A continuación, deberás agregar la cuenta para el grupo de aplicaciones que usa tu aplicación y concederle al menos permiso de lectura para las claves.
    1. NOTA: si usas las nuevas cuentas integradas en IIS 7.5, como ApplicationPoolIdentity, deberás conceder acceso a IIS apppool\ASP.NET v4.0, donde “ASP.NET v4.0” es el nombre de tu grupo de aplicaciones.
  5. En el código en el que envías el mensaje a los Servicios de notificaciones de inserción debes agregar el certificado al objeto HttpWebRequest. Por lo general, esto se hace abriendo el Almacén X509, obteniendo la colección de certificados para Mi almacén, realizando una búsqueda en la colección por huella digital, donde debes copiar y pegar la huella digital del certificado de las propiedades del certificado a tu código y, a continuación, usando el primer certificado de la colección que devuelve (es decir, myCollection[0]). Tras obtener el certificado, puedes agregarlo a tu solicitud de la siguiente manera: myRequest..ClientCertificates.Add(mySslCertificate);

Otros aspectos importantes que tener en cuenta:

  • El certificado que cargues solo se usa durante cuatro meses. Si no envías una solicitud de certificación al mercado que usa el certificado, será necesario cargarlo de nuevo. Al enviar tu aplicación para su certificación al mercado, podrás seleccionar un certificado para la misma de la lista de certificados que hayas cargado. Solo tienes que seleccionar el certificado que hayas cargado para estas comunicaciones y listo.
  • ¿Cómo puedes saber si esto funciona? Cuando crees la instancia de clase HttpNotificationChannel en el cliente de Windows Phone, obtendrás un URI de canal de notificación al que se envían tus mensajes. Observa ese URI; si no usas una conexión autenticada, verás "throttledthirdparty" en la ruta. Sin embargo, si has creado correctamente la instancia de clase, la ruta contendrá "unthrottledthirdparty". Además, el protocolo que muestra será HTTPS en lugar de HTTP. A continuación, como es lógico, para asegurarte de que verdaderamente funciona, deberás enviar correctamente un mensaje tras obtener el URI. Si llega correctamente a tu dispositivo, sabrás que funciona.

Esta entrada de blog es una traducción. Puedes consultar el artículo original en How To Send An Authenticated Message to the Windows Phone Push Notification Service