gpt4 book ai didi

ios - UIWebView iOS 中的客户端证书身份验证

转载 作者:可可西里 更新时间:2023-11-01 05:15:15 25 4
gpt4 key购买 nike

我是 objective c 的新手,但我正在开发一个应用程序,它有一个 UIWebView 可以加载一些网络内容。所有网页都需要客户端证书进行身份验证,我在露水日里苦苦挣扎。有谁知道如何在 UIWebView 中实现它的流程?

谢谢!

最佳答案

为避免 UIWebView 出现任何问题,您必须在请求 Web View 之前使用客户端证书向您的网站根目录发出请求。您可以使用 UIWebViewDelegate 方法:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

在此之后,UIWebView 将能够毫无问题地加载所有内容。

如果您是 Objective-C 的新手,我想您也是 Foundation 框架的新手,所以这里有一些帮助。

为了解决这个问题,我使用了 ASIHTTPRequest,因为它已经嵌入到我们的项目中。但是您可以使用 NSURLConnection 并在 NSURLConnectionDelegate 方法中执行逻辑:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

因此,这是我在 UIWebView 请求之前向 ASIHTTPRequest 提供客户端证书的代码:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

SecIdentityRef identity = NULL;
SecTrustRef trust = NULL;
NSData *PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test.cert" ofType:@"pfx"]];

[self extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data];

NSURL *serverUrl = [NSURL URLWithString:URL_SECURE_SERVER];
ASIHTTPRequest *firstRequest = [ASIHTTPRequest requestWithURL:serverUrl];

[firstRequest setValidatesSecureCertificate:NO];
[firstRequest setClientCertificateIdentity:identity];
[firstRequest startSynchronous];

return YES;
}

我正在同步发送请求以确保在让 UIWebView 开始加载之前它已完成。

我使用一种方法从证书中检索身份,即:

- (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data
{
OSStatus securityError = errSecSuccess;
NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"mobigate" forKey:(id)kSecImportExportPassphrase];

CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
securityError = SecPKCS12Import((CFDataRef)inPKCS12Data,(CFDictionaryRef)optionsDictionary,&items);

if (securityError == 0) {
CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
const void *tempIdentity = NULL;

tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
*outIdentity = (SecIdentityRef)tempIdentity;

const void *tempTrust = NULL;

tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
*outTrust = (SecTrustRef)tempTrust;

}
else {
NSLog(@"Failed with error code %d",(int)securityError);
return NO;
}

return YES;
}

这里使用相同的技术,但使用 NSURLConnection 而不是 ASIHTTPRequest

  • 获取您的 SecIdentityRef 和 SecCertificateRef
  • 使用这些信息创建一个 NSURLCredential
  • 在 connection:didReceiveAuthenticationChallenge: 方法中将此 NSURLCredential 发送回 [challenge sender]

要将证书与 NSURLConnection 一起使用,您必须实现 NSURLConnectionDelegate 方法:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

在这个方法中,NSURLConnection 告诉你它收到了一个质询。您将必须创建一个 NSURLCredential 以发送回 [challenge sender]

所以你创建了你的 NSURLCredential:

+ (NSURLCredential *)credentialWithIdentity:(SecIdentityRef)identity certificates:(NSArray *)certArray persistence:(NSURLCredentialPersistence)persistence
{

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"];
NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath];

SecIdentityRef myIdentity; // ???

SecCertificateRef myCert = SecCertificateCreateWithData(NULL, (CFDataRef)certData);
[certData release];
SecCertificateRef certArray[1] = { myCert };
CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);
CFRelease(myCert);
NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity
certificates:(NSArray *)myCerts
persistence:NSURLCredentialPersistencePermanent];
CFRelease(myCerts);
}

最后将它与

一起使用
- (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

关于[挑战发送者]

您应该拥有所需的一切。祝你好运。

关于ios - UIWebView iOS 中的客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9483472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com