2012-10-12 21 views
5

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:

  1. I widać rozwiązań celem C, ale nie znaleziono równoważną zestaw kroków wymaganych MonoTouch (C#).
  2. Nie mogę użyć HttpWebRequest, ponieważ implementacja monotouch httpWebRequest.ClientCertificates (kolekcja) zgłasza wyjątek "nie zaimplementowany".
  3. 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.
  4. Zobacz także this.

Odpowiedz

1

użytkowania HttpWebRequest. W punkcie 2 uwag do pytania powiedziałem, że właściwość HttpWebRequest.ClientCertificates zgłasza wyjątek niezaakceptowany i dlatego wykluczyłem tę opcję. Dzieje się tak, jeśli spróbujesz ustawić właściwość z nową kolekcją, ale jeśli po prostu użyjesz akcesora Get, możesz dodać certyfikat klienta do kolekcji.

Na marginesie, korzystanie z HttpWebRequest sprawia, że ​​aplikacja jest bardziej przenośna na inne urządzenia, co jest jednym z powodów, dla których używamy MonoDevelop, więc korzystna dla wszystkich.

+0

jakikolwiek pomysł, jak sprawić, by działało to z NSUrlSession? – nhenrique

2

nie mam środowisko serwera skonfigurować, aby spróbować tego, ale spróbuj tego:

Wymienić:

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

z:

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

Dzięki :) To sprawiło, że przeszedłem przez problem, jak zdobyć uchwyt, a więc "zaakceptowana odpowiedź". Niestety żądanie nadal się nie udaje (nawet jeśli zainstalowanie certyfikatu jako części profilu na iPhonie działa przy użyciu przeglądarki Safari podłączonej do witryny). Nie widziałem nikogo, kto osiągnąłby sukces przy użyciu MonoTouch i certyfikatów klienta. Mam tylko nadzieję, że robię coś głupiego i nie jest to po prostu niemożliwe/nieobsługiwane. Będę kontynuował badania. Doceń pomoc. – Bruce

Powiązane problemy