如何在Cocoa中使用WebView与客户端证书连接?

| 我正在尝试连接到需要客户端证书的服务器。 因此,浏览到该服务器时发生的正常事件流程是Web浏览器(Safari和Chrome)都提示用户选择证书并重试该操作。 那么如何在Cocoa项目的嵌入式WebView中完成此任务? 到目前为止,我已经确定在
didFailProvisionalLoadWithError
方法中会引发错误:
- (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame {
    NSLog(@\"webView:didFailProvisionalLoadWithError:forFrame:\");
    NSLog(@\"    error = %@\", error);
}
错误的确是
error = Error Domain=NSURLErrorDomain Code=-1206 UserInfo=0x1006a8030 \"The server “myserver.xxx” requires a client certificate.
但是,如何显示对话框,以便用户可以从钥匙串中选择证书?     
已邀请:
问题解决了。 WebView组件的一个(已知)问题是罪魁祸首。 与Apple开通了DTS支持票证,并找到了解决方法。 编辑: 这是DTS的解决方法(我不知道这是否仍然有效,因为它是3年前的):   Magnus好吧,我有机会看看这个,我知道会发生什么   上。在我们开始谈论WebView之前,我需要带您了解   加快NSURLConnection使用的委托方法,即   用于实际从网络上加载数据的底层API。   NSURLConnection开始支持单一身份验证   委托回调-connection:didReceiveAuthenticationChallenge:   它通过了各种身份验证挑战   当时受支持(用户名/密码风格的挑战)。在Mac中   OS X 10.6(和iOS 3.0)NSURLConnection已增强,可支持两个   TLS连接的身份验证挑战的其他类型:o   客户身份挑战   (NSURLAuthenticationMethodClientCertificate),为委托提供   有机会为给定的TLS连接选择客户端身份o   服务器信任挑战(NSURLAuthenticationMethodServerTrust),   委托机会覆盖服务器信任评估   对于给定的TLS连接出于兼容性原因,它不是   可以将这些挑战全部传递给代表   在这种情况下,NSURLConnection引入了一个新的委托回调,   -connection:canAuthenticateAgainstProtectionSpace :,使委托可以选择接受这些挑战。                       * * *现在,让我们将其带回到您的应用中。如前所述,WebView使用   NSURLConnection,并为每个连接充当连接   代表。它拦截身份验证挑战并将其传递给   其资源负载委托。这对老派来说很好   身份验证的挑战,因为WebView面临的挑战是   要做一些特别的事情;但无法进行TLS连接   身份验证挑战,因为委托人必须选择那些   挑战。您真正需要的是WebView版本的   \'canAuthenticateAgainstProtectionSpace \'身份验证质询。   好吧,事实证明这是实际实现的。在看   通过WebView的开源,我发现有一个私有的   委托回调,   -webView:resource:canAuthenticateAgainstProtectionSpace:forDataSource :,   正是您想要的。   http://www.opensource.apple.com/source/WebKit/WebKit-7533.20.25/mac/WebView/WebResourceLoadDelegatePrivate.h   如果实施该方法,则可以选择加入客户端身份   身份验证质询,并基于该质询向用户展示   允许用户选择身份的界面。我原型   在您的测试应用程序中,它的魅力。这是我以前使用的代码   获得客户身份挑战:   -(BOOL)webView:(WebView *)发送方资源:(id)标识符canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace   *)protectionSpace forDataSource:(WebDataSource *)dataSource {        NSLog(@ \“%@ \”,[protectionSpace authenticationMethod]);        返回[[protectionSpace authenticationMethod] isEqual:NSURLAuthenticationMethodClientCertificate]; },这是   我用来回应的代码:   -(void)webView:(WebView *)发送方资源:(id)标识符didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge   *)来自DataSource的挑战:(WebDataSource *)dataSource {        NSLog(@ \“ didReceiveAuthenticationChallenge \”);        NSString * authenticationMethod = [[挑战保护空间] authenticationMethod];        NSLog(@ \“ authenticationMethod =%@ \”,authenticationMethod);
 [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; }
     显然,在真实应用中,您需要显示一些用户界面,然后,   用户已选择客户端身份,并为其创建凭据   (+ [NSURLCredential credentialWithIdentity:certificates:persistence:])   然后将那个凭据应用于挑战   (-useCredential:forAuthenticationChallenge :)。                       * * *那么,从这里开始呢?无论您做什么,都应该   针对WebView提交错误以获取   -webView:resource:canAuthenticateAgainstProtectionSpace:forDataSource:在公共标头中发布的委托回调。很明显   最烦人的是,遗漏了http://developer.apple.com/bugreporter/   提交错误后,请将错误号发送给我,以便我可以   将其与此事件关联。除此之外,前进的道路更少   明确。如果您要创建非Mac App Store应用,我的建议是   就是您只需实施   \'canAuthenticateAgainstProtectionSpace \'委托回调   如上所示,继续您的生活。 OTOH,如果您要创建一个   Mac App Store应用程序,其中使用私有API,包括委托   回调,是严格禁止的,生活变得更加棘手。让我   知道这种情况,我们可以讨论您的选择。分享和享受     
设置一个“ 4”并实现与身份验证挑战相关的委托方法。收到身份验证质询时将提示您,此时您可以提供要使用的证书。 预计到达时间:这是从
clientSide.p12
中存储的证书中创建
NSURLCredential
的方法:
NSString *thePath = [[NSBundle mainBundle]
        pathForResource:@\"clientside\" ofType:@\"p12\"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;    
SecIdentityRef identity;
SecTrustRef trust;
extractIdentityAndTrust(inPKCS12Data, &identity, &trust);

SecCertificateRef certificate = NULL;
SecIdentityCopyCertificate (identity, &certificate); 

const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

NSURLCredential *credential = [NSURLCredential
        credentialWithIdentity:identity
        certificates:(NSArray*)certArray
        persistence:NSURLCredentialPersistencePermanent];
这来自另一个问题。您可能还会发现此问题有帮助。我是通过Google搜索“ nsurlcredential证书”找到的。     

要回复问题请先登录注册