我显然错过了啊哈!那一刻,因为我一直在研究使用CA或自签名证书等,以获得对安全URL https的访问,而我仍然无法完全理解它,我大多只是在与其他人的代码和解决方案一起试图获取我的工作,我显然缺乏基本的理解,所以希望网站的居民可以提供帮助。
基本上,我有一个使用自签名证书与https服务器进行通信的应用程序。
我认为访问服务器所需的证书和密钥都存储在应用程序根域中存储的p12中。然后我通过我在互联网上找到的代码将这个p12添加到手机或应用程序钥匙串
NSString *p12Path = [[NSBundle mainBundle] pathForResource:p12Name ofType:@"p12"];
NSData *p12Data = [[NSData alloc] initWithContentsOfFile:p12Path];
NSError *error = nil;
NSData *data = [[SFHFKeychainUtils getPasswordForUsername:[[UIDevice currentDevice]name] andServiceName:serviceName error:&error] dataUsingEncoding:NSUTF8StringEncoding];
[self transform:data];
NSString *pass = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
CFStringRef password = (__bridge CFStringRef)pass;
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CFArrayRef p12Items;
OSStatus result = SecPKCS12Import((__bridge CFDataRef)p12Data, optionsDictionary,&p12Items);
if(result == noErr)
{
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(p12Items, 0);
SecIdentityRef identityApp =(SecIdentityRef)CFDictionaryGetValue(identityDict,kSecImportItemIdentity);
SecCertificateRef certRef;
SecIdentityCopyCertificate(identityApp,&certRef);
SecCertificateRef certArray[1] = { certRef };
CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL);
CFRelease(certRef);
NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identityApp certificates:(__bridge NSArray *)myCerts persistence:NSURLCredentialPersistencePermanent];
CFRelease(myCerts);
[[RKObjectManager sharedManager].HTTPClient setDefaultCredential:credential];
}
而且,这似乎有效,但我必须启用此功能
_httpClient = [RKObjectManager sharedManager].HTTPClient;
[_httpClient setAllowsInvalidSSLCertificate:YES];
否则它没有连接,现在我已经看到各种帖子说,你需要将此设置为yes以允许自签名证书,但与此同时我看到其他帖子说它应该只用于开发否则这会使使用https完全冗余。显然,冗余安全性很差,所以我将其设置为no ......并且它没有连接。
所以真的有人有任何链接或者可以节省一些时间来填补我对这些东西如何运作的知识空白吗?我会非常感激,并且会让我从老板那里得到悲伤。