2012-10-12 5 views
5

MonoTouch를 사용하여 SSL 연결에 클라이언트 인증서를 사용하려고합니다. objective-c를 사용하여이 작업을 수행하는 몇 가지 예제가있는 것으로 보입니다. 내가 찾고있는 솔루션은 아마도 비슷할 것이라고 here하지만 MonoTouch (C#)에서 대답했습니다.Monotouch로 HTTPS 클라이언트 인증서

MonoTouch에서 NSUrlConnection 클래스를 사용 중이며 인증 시도에 응답하기 위해 NSUrlConnectionDelegate 클래스를 재정의했습니다.

파일에서 인증서를로드 할 수 있었지만 인증 시도에 응답하는 데 유용한 인증서를 찾을 수 없었습니다.

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

일부 노트 :

  1. 나는 목표 - C 솔루션을 보았다하지만 난 MonoTouch (C#을)에 필요한 단계에 해당 세트를 발견하지 않았습니다.
  2. httpWebRequest.ClientCertificates (컬렉션)의 모노 터치 구현이 '구현되지 않은 예외'를 throw하므로 HttpWebRequest를 사용할 수 없습니다.
  3. Mono.Security.X509 및 System.Security.Cryptography.X509Certificates 네임 스페이스를 사용하여 인증서를 성공적으로 열려고 시도했지만 다시 클래스 인스턴스를 사용하여 인증 요청에 응답 할 수 없습니다. IntPtr만을 받아들이는 NSUrlCredential 객체를 생성합니다.
  4. this도 참조하십시오.

답변

1

사용의 HttpWebRequest. 질문 노트 포인트 2에서 HttpWebRequest.ClientCertificates 속성이 구현되지 않은 예외를 던졌습니다, 그래서 나는이 옵션을 배제했다. 새 컬렉션으로 속성을 설정하려고 시도하지만 Get 접근 자만 사용하는 경우 컬렉션에 클라이언트 인증서를 추가 할 수 있습니다.

참고로 HttpWebRequest를 사용하면 다른 장치로 응용 프로그램을 더 이동 가능하게 만들 수 있습니다. MonoDevelop를 사용하는 이유 중 하나이기 때문에 win-win.

+0

NSUrlSession을 사용하여이 작업을 수행하는 방법에 대한 아이디어가 있습니까? – nhenrique

2

나는 이것을 시도하도록 설정 서버 환경을 가지고 있지만,이 시도하지 않는 :

바꾸기 :

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

로 :

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

감사합니다 :) 그게 어떻게 핸들을 얻는 지, 그리고 따라서 '수락 된 대답'의 문제를 해결했습니다. 불행하게도 요청은 여전히 ​​실패합니다 (iPhone에 프로필의 일부로 인증서를 설치하는 것은 사이트에 연결된 Safari를 사용하여 작동 함에도 불구하고). MonoTouch 및 클라이언트 인증서를 사용하여 성공한 사람은 없었습니다. 내가 바보 같은 짓을하고 있기를 바랄 뿐이며, 단순히 가능하지 않거나 지원되지 않는다는 것이 아닙니다. 연구를 계속할 것입니다. 도움을 감사하십시오. – Bruce