HttpListener con HTTPS en MonoTouch

Implementé un server web muy simple usando el HttpListener en MonoTouch. Todo está funcionando bien. Ahora necesito agregar soporte HTTPS. Traté de seguir los pasos de

Httplistener con soporte https

pero no sé dónde configurar los certificates en MonoTouch. Simplemente agregar el prefijo "https: // *: 443" no ayuda, ya que no hay conexiones posibles y no se generan excepciones.

De acuerdo con http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx , esto podría deberse a que uno debe especificar un certificate de server ("Puede configurar los Certificados de server y otras opciones de escucha mediante el uso HttpCfg.exe ").

¿Cómo puedo hacerlo en MonoTouch?

Esta es una muy buena pregunta. En algunos casos, al igual que para HttpListener , .NET requiere herramientas o files .config (usando System.Configuration ) para modificar la configuration de una aplicación. En muchos casos, hay API para lograr el mismo propósito, pero no siempre (y no en este caso).

La solución es mirar el código fuente de Mono para ver qué espera que configure la herramienta HttpCfg.exe para la aplicación. De github :

 string dirname = Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData); string path = Path.Combine (dirname, ".mono"); path = Path.Combine (path, "httplistener"); string cert_file = Path.Combine (path, String.Format ("{0}.cer", port)); if (!File.Exists (cert_file)) return; string pvk_file = Path.Combine (path, String.Format ("{0}.pvk", port)); if (!File.Exists (pvk_file)) return; cert = new X509Certificate2 (cert_file); key = PrivateKey.CreateFromFile (pvk_file).RSA; 

Por lo tanto, la solución es crear la misma estructura de directory (es posible ya que apuntará en el directory de Documents ) y copyr el file .cer (certificate binary DER-codificado) y el file .pvk (que es la key privada en el formatting que makecert crea) con el número de puerto como el nombre del file.

Con esos files en su lugar, debería poder iniciar el HttpListener y hacer que cargue el certificate requerido y la key privada requerida para manejar las requestes de SSL.