Sto tentando di utilizzare i certificati client per una connessione SSL utilizzando MonoTouch. Sembra che ci siano molti esempi per farlo usando l'obiettivo-c, e la soluzione che sto cercando sarebbe probabilmente simile a quella che ha risposto here ma in MonoTouch (C#).Certificati client HTTPS con Monotouch
Sto utilizzando la classe NSUrlConnection in MonoTouch e ho sovrascritto la classe NSUrlConnectionDelegate per rispondere alla richiesta di autenticazione.
Sono stato in grado di caricare i certificati dal file, ma non sono riuscito a trovare un'utile rappresentazione dei certificati per rispondere alla richiesta di autenticazione.
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);
}
}
Alcune note:
- ho visto le soluzioni Objective-C, ma non ho trovato l'insieme equivalente di passaggi necessari a MonoTouch (C#).
- Non riesco a utilizzare HttpWebRequest, poiché l'implementazione monotipo di httpWebRequest.ClientCertificates (una raccolta) genera un'eccezione non implementata.
- Ho anche tentato di utilizzare Mono.Security.X509 e System.Security.Cryptography.X509Certificates namespaces per aprire i certificati con esito positivo, ma ancora non riesco a utilizzare le istanze di classe per rispondere alla richiesta di autenticazione, poiché è necessario creare un oggetto NSUrlCredential che accetta solo un IntPtr.
- Vedere anche this.
qualche idea su come farlo funzionare con NSUrlSession? – nhenrique