2012-10-12 283 views
5

Estoy intentando utilizar certificados de cliente para una conexión SSL usando MonoTouch. Parece que hay varios ejemplos para hacer esto usando Object-C, y la solución que estoy buscando probablemente sea similar a la que respondió here pero en MonoTouch (C#).Certificados de cliente HTTPS con Monotouch

Estoy usando la clase NSUrlConnection en MonoTouch, y he reemplazado la clase NSUrlConnectionDelegate para responder al desafío de autenticación.

He podido cargar los certificados desde el archivo, pero no he podido encontrar una representación útil de los certificados para responder al desafío de autenticación.

public override void ReceivedAuthenticationChallenge(NSUrlConnection connection, NSUrlAuthenticationChallenge challenge) 
{ 
    if (string.Equals(challenge.ProtectionSpace.AuthenticationMethod, "NSURLAuthenticationMethodClientCertificate", StringComparison.OrdinalIgnoreCase)) { 
     string password = "<password_signed_certificate>"; 
     byte[] data = File.ReadAllBytes("<path_of_file_in_ios_sandboxed_filesystem_pkcs>"); 
     NSDictionary opt = NSDictionary.FromObjectsAndKeys(new object[]{password}, new object[]{"passphrase"}); 
     NSDictionary[] items; 
     SecStatusCode stat = SecImportExport.ImportPkcs12(data, opt, out items); // Uses MonoTouch.Security namespace 
     MonoTouch.Security.SecTrust trust = (MonoTouch.Security.SecTrust)items[0]["trust"]; 
     // Everything to this point works, and I can inspect the trust object that all the expected certificate properties (IssuerName etc.) are correct 

     IntPtr secTrustRef = trust // ????? How do I bridge this gap 
     // NSUrlConnection does not utilise MonoTouch security namespace 

     NSUrlCredential cred = new NSUrlCredential(secTrustRef, true); 
     challenge.Sender.UseCredentials(cred, challenge); 
    } 
} 

Algunas notas:

  1. I han visto las soluciones de Objective-C pero no han encontrado el conjunto equivalente de pasos necesarios en MonoTouch (C#).
  2. No puedo utilizar HttpWebRequest, ya que la implementación monotouch de httpWebRequest.ClientCertificates (una colección) arroja una 'excepción no implementada'.
  3. También intenté usar los espacios de nombres Mono.Security.X509 y System.Security.Cryptography.X509Certificates para abrir los certificados con éxito, pero de nuevo no puedo utilizar las instancias de clase para responder al desafío de Autenticación, ya que necesito crea un objeto NSUrCredential que solo acepta un IntPtr.
  4. Véase también this.

Respuesta

1

Uso HttpWebRequest. En el punto 2 de las notas de pregunta, dije que la propiedad HttpWebRequest.ClientCertificates arroja una excepción no implementada, y por lo tanto, descarté esta opción. Lo hace si intenta establecer la propiedad con una nueva colección, pero si solo usa el acceso Obtener, puede agregar un certificado de cliente a la colección.

Como nota al margen, el uso de HttpWebRequest hace que la aplicación sea más transportable a otros dispositivos, en parte porque estamos utilizando MonoDevelop para ganar todos.

+0

alguna idea sobre cómo hacer que esto funcione con NSUrlSession? – nhenrique

2

que no tienen un entorno de servidor establecido para juzgar esto, pero intente esto:

Reemplazar:

... 
MonoTouch.Security.SecTrust trust = (MonoTouch.Security.SecTrust)items[0]["trust"]; 
IntPtr secTrustRef = trust 
... 

con:

... 
NSObject obj = items[0]["trust"]; 
IntPtr secTrustRef = obj.Handle; 
... create and use your credentials 
GC.KeepAlive (obj); // just in case ;-) 
... 
+0

Gracias :) Eso me ayudó a superar el problema de cómo obtener el mango, y por lo tanto la 'respuesta aceptada'. Lamentablemente, la solicitud sigue fallando (aunque la instalación del certificado como parte de un perfil en iPhone funciona con Safari conectado al sitio). No he visto a nadie tener éxito usando MonoTouch y certificados de clientes. Solo espero estar haciendo algo estúpido, y no es que simplemente no sea posible/no sea compatible. Seguiremos investigando. Apreciar la asistencia. – Bruce

Cuestiones relacionadas