Xamarin iOS客户端证书authentication

我设法成功地使用.Net HttpWebRequest类的客户端证书,但我现在正在尝试更新ModernHttpClient以支持客户端证书,因此它使用更高效的iOS库来处理请求。

我修改了DidReceiveChallenge中的DidReceiveChallenge函数来检查ClientCertificate的挑战,并试图通过https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/AuthenticationChallenges.html上的信息将其转换为Xamarin iOS。 代码编译正确,并逐步通过它导致没有错误打印出来,但最终我仍然得到一个System.Net.WebException与消息“服务器”xxx.example.com“需要客户端证书”抛出。

我的代码在下面…

 public override void DidReceiveChallenge(NSUrlSession session, NSUrlSessionTask task, NSUrlAuthenticationChallenge challenge, Action<NSUrlSessionAuthChallengeDisposition, NSUrlCredential> completionHandler) { ...snip... if (challenge.ProtectionSpace.AuthenticationMethod == NSUrlProtectionSpace.AuthenticationMethodClientCertificate) { Console.WriteLine("Client Cert!"); var password = "xxxxx"; var options = NSDictionary.FromObjectAndKey(NSObject.FromObject(password), SecImportExport.Passphrase); var path = Path.Combine(NSBundle.MainBundle.BundlePath, "Content", "client.p12"); var certData = File.ReadAllBytes(path); NSDictionary[] importResult; X509Certificate cert = new X509Certificate(certData, password); SecStatusCode statusCode = SecImportExport.ImportPkcs12(certData, options, out importResult); var identityHandle = importResult[0][SecImportExport.Identity]; var identity = new SecIdentity(identityHandle.ClassHandle); var certificate = new SecCertificate(cert.GetRawCertData()); SecCertificate[] certificates = { certificate }; NSUrlCredential credential = NSUrlCredential.FromIdentityCertificatesPersistance(identity, certificates, NSUrlCredentialPersistence.ForSession); completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential); return; } ...snip... } 

如果你想试用它,我已经把我的修改提交到了GitHub( https://github.com/MrsKensington/ModernHttpClient )。 顺便说一句,testing客户端证书的安全的Web服务器绝对没有任何价值(只有一个.txt文件),证书和密码是唯一的这个Web服务器,所以我没有与世界分享这个问题。

提前感谢您的帮助,

肯辛顿太太

你不应该使用句柄,而不是类句柄?

 var identity = new SecIdentity(identityHandle.Handle); 

你到目前为止有什么进展? 我需要一个WkWebView应用程序的类似的代码。