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:
- I han visto las soluciones de Objective-C pero no han encontrado el conjunto equivalente de pasos necesarios en MonoTouch (C#).
- No puedo utilizar HttpWebRequest, ya que la implementación monotouch de httpWebRequest.ClientCertificates (una colección) arroja una 'excepción no implementada'.
- 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.
- Véase también this.
alguna idea sobre cómo hacer que esto funcione con NSUrlSession? – nhenrique