2012-10-12 41 views
5

Tôi đang cố sử dụng chứng chỉ ứng dụng khách cho kết nối SSL bằng MonoTouch. Có vẻ là một vài ví dụ để làm điều này bằng cách sử dụng mục tiêu-c, và giải pháp tôi đang tìm kiếm có lẽ sẽ giống như một câu trả lời here nhưng trong MonoTouch (C#).Chứng chỉ ứng dụng khách HTTPS với Monotouch

Tôi đang sử dụng lớp NSUrlConnection trong MonoTouch và đã ghi đè lớp NSUrlConnectionDelegate để phản hồi thử thách xác thực.

Tôi đã có thể tải chứng chỉ từ tệp nhưng tôi không thể tìm thấy đại diện hữu ích của chứng chỉ để phản hồi thử thách xác thực.

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

Một số lưu ý:

  1. Tôi đã thấy những giải pháp Objective-C nhưng tôi đã không tìm thấy các thiết lập tương đương với bước cần thiết trong MonoTouch (C#).
  2. Tôi không thể sử dụng HttpWebRequest, vì việc triển khai monotouch của httpWebRequest.ClientCertificates (một bộ sưu tập) ném một 'ngoại lệ không được thực hiện'.
  3. Tôi cũng đã cố gắng sử dụng Mono.Security.X509 và System.Security.Cryptography.X509Các chứng chỉ không gian tên để mở chứng chỉ thành công, nhưng một lần nữa tôi không thể sử dụng các cá thể lớp để phản hồi thử thách Xác thực, như tôi cần tạo một đối tượng NSUrlCredential chỉ chấp nhận một IntPtr.
  4. Xem thêm this.

Trả lời

1

Sử dụng HttpWebRequest. Trong câu hỏi ghi chú điểm 2 tôi nói rằng HttpWebRequest.ClientCertificates tài sản ném một ngoại lệ không được thực hiện, và do đó tôi loại trừ tùy chọn này. Nếu bạn cố gắng thiết lập thuộc tính với một bộ sưu tập mới, nhưng nếu bạn chỉ sử dụng trình truy cập Nhận, bạn có thể thêm chứng chỉ ứng dụng khách vào bộ sưu tập.

Như một lưu ý phụ, việc sử dụng HttpWebRequest làm cho ứng dụng dễ vận chuyển hơn đối với các thiết bị khác, một phần lý do chúng tôi đang sử dụng MonoDevelop để giành chiến thắng.

+0

bất kỳ ý tưởng nào về cách thực hiện công việc này với NSUrlSession? – nhenrique

2

Tôi không có một môi trường máy chủ thiết lập để cố gắng này, nhưng cố gắng này:

Thay thế:

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

với:

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

Cảm ơn :) Điều đó khiến tôi vượt qua vấn đề về cách xử lý và do đó là 'câu trả lời được chấp nhận'. Rất tiếc, yêu cầu vẫn không thành công (mặc dù việc cài đặt chứng chỉ như một phần của hồ sơ trên iPhone hoạt động bằng cách sử dụng Safari được kết nối với trang web). Tôi chưa thấy ai có được thành công khi sử dụng MonoTouch và chứng chỉ ứng dụng khách. Chỉ cần hy vọng tôi đang làm điều gì đó ngu ngốc, và không phải là nó chỉ đơn giản là không thể/không được hỗ trợ. Sẽ tiếp tục nghiên cứu. Đánh giá cao sự hỗ trợ. – Bruce

Các vấn đề liên quan