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 ý:
- 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#).
- 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'.
- 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.
- Xem thêm this.
bất kỳ ý tưởng nào về cách thực hiện công việc này với NSUrlSession? – nhenrique