2012-10-12 27 views
5

MonoTouch kullanarak bir SSL bağlantısı için istemci sertifikalarını kullanmaya çalışıyorum. Bu objektif-c kullanarak bunu yapmak için birkaç örnek var gibi görünüyor ve aradığınız çözüm muhtemelen here cevapla ama MonoTouch (C#) benzer.HTTPS İstemci Sertifikaları

MonoTouch'da NSUrlConnection sınıfını kullanıyorum ve kimlik doğrulama sorununu yanıtlamak için NSUrlConnectionDelegate sınıfını geçersiz kıldı.

Sertifikaları dosyadan yükleyebildim, ancak kimlik doğrulama sorununu yanıtlamak için sertifikaların yararlı bir temsilini bulamadım.

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); 
    } 
} 

bazı notlar:

  1. nesnel-c çözümler gördük ama MonoTouch (C#) 'de gerekli olan adımların eşdeğer dizi bulamadık.
  2. HttpWebRequest, httpWebRequest.ClientCertificates (bir koleksiyon) monotouch uygulaması bir 'uygulanan istisna değil' atar olarak kullanamazsınız.
  3. Ayrıca sertifikaları başarı ile açmak için Mono.Security.X509 ve System.Security.Cryptography.X509Certificates ad alanlarını kullanmayı denedim, ancak yine de kimlik doğrulama sorgusuna yanıt vermek için sınıf örneklerini kullanamıyorum. Yalnızca bir IntPtr kabul eden bir NSUrlCredential nesnesi oluşturun. Ayrıca, this numaralı telefona da bakın.

cevap

1

Kullanım HttpWebRequest. 2 no'lu soru notlarında HttpWebRequest.ClientCertificates özelliği uygulanmayan bir istisna atar ve bu yüzden bu seçeneği reddettim. Yeni bir koleksiyonla mülkünü ayarlamaya çalışırsanız, ancak yalnızca Erişim sağlayıcıyı kullanırsanız, koleksiyona bir istemci sertifikası ekleyebilirsiniz.

Bir yan not olarak, HttpWebRequest uygulamasını kullanarak uygulamayı diğer cihazlara daha taşınabilir hale getirir; bu nedenle MonoDevelop'u kullanmamızın bir sebebi kazan-kazan.

+0

NSUrlSession ile bu işin nasıl yapıldığına dair bir fikrin var mı? – nhenrique

2

Bunu denemek için kurulmuş bir sunucu ortamına sahip, ancak bu kalkmayın:

değiştirin:

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

ile:

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

Teşekkürler :) Bu, beni nasıl ele alacağımı ve dolayısıyla 'kabul edilen cevabı' ele geçirdi. Maalesef istek hala başarısız oluyor (iPhone'da bir profilin parçası olarak sertifika yüklemesine rağmen, siteye bağlı Safari'yi kullanıyor.) MonoTouch ve istemci sertifikalarını kullanan herkesin başarılı olduğunu görmedim. Sadece aptalca bir şey yapıyorum umuyoruz, sadece mümkün değil/desteklenmiyor. Araştırmaya devam edecek. Yardımı takdir ediyorum. – Bruce