我正在与客户端证书身份验证进行斗争.当服务器需要凭证(在这种情况下是证书)时,从NSURLConnection委托调用此方法:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Run Code Online (Sandbox Code Playgroud)
我想从文件加载证书,填写凭证并运行此方法:
[[challenge sender] useCredential:[self credential] forAuthenticationChallenge:challenge];
Run Code Online (Sandbox Code Playgroud)
但我不知道如何初始化(或填充)SecIdentityRef参数.这是我创建凭据的代码:
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);
Run Code Online (Sandbox Code Playgroud)
有人知道怎么解决吗?谢谢.
我终于找到了解决方案,但是这里出现了一个新问题:
我的客户端不会将证书发送到服务器.服务器请求证书后,应用程序运行此方法:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Run Code Online (Sandbox Code Playgroud)
并填写凭证(如上所述),但连接以错误结束:NSURLErrorDomain -1206.根据服务器日志,应用程序不会发送客户端证书.
有没有人有这种行为的经验?我是否需要以某种方式验证应用程序中的证书?或其他任何使其有效的方法?如果它有帮助,我可以提供我当前的代码.谢谢你的任何想法......