Próbuję użyć certyfikatów klienta dla połączenia SSL za pomocą MonoTouch. Wydaje się, że istnieje kilka przykładów, aby to zrobić przy użyciu funkcji -c, a rozwiązanie, którego szukam, prawdopodobnie będzie podobne do odpowiedzi na here, ale w MonoTouch (C#).Certyfikaty klienta HTTPS z Monotouch
Używam klasy NSUrlConnection w MonoTouch i nadpisałem klasę NSUrlConnectionDelegate, aby odpowiedzieć na wyzwanie uwierzytelnienia.
Byłem w stanie załadować certyfikaty z pliku, ale nie byłem w stanie znaleźć przydatnej reprezentacji certyfikatów w odpowiedzi na wyzwanie uwierzytelnienia.
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);
}
}
Niektóre Uwagi:
- I widać rozwiązań celem C, ale nie znaleziono równoważną zestaw kroków wymaganych MonoTouch (C#).
- Nie mogę użyć HttpWebRequest, ponieważ implementacja monotouch httpWebRequest.ClientCertificates (kolekcja) zgłasza wyjątek "nie zaimplementowany".
- Próbowałem również użyć przestrzeni nazw Mono.Security.X509 i System.Security.Cryptography.X509Certificates, aby pomyślnie otworzyć certyfikaty, ale znowu nie mogę wykorzystać wystąpień klas do odpowiedzi na wyzwanie uwierzytelniania, ponieważ potrzebuję utwórz obiekt NSUrlCredential, który akceptuje tylko IntPtr.
- Zobacz także this.
jakikolwiek pomysł, jak sprawić, by działało to z NSUrlSession? – nhenrique