OStack程序员社区-中国程序员成长平台

标题: ios - SSL 证书混淆 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 19:02
标题: ios - SSL 证书混淆

我显然错过了啊哈!因为我一直在研究使用 CA 或自签名证书等以获得对安全 URL https 的访问权限,但我仍然无法完全理解它,我主要是在与其他人代码和解决方案一起尝试并获得我的工作,我显然缺乏基本的了解,所以希望该网站的居民可以提供帮助。

基本上,我有一个使用自签名证书与 https 服务器通信的应用程序。

我认为访问服务器所需的证书和 key 都存储在存储在应用程序根包中的 p12 中。然后我通过我在互联网上找到的这段代码将这个 p12 添加到手机或应用程序钥匙串(keychain)中

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];

否则它无法连接,现在我看到各种帖子说,你需要将此设置为是以允许自签名证书,但同时我看到其他帖子说它应该只用于开发否则这会使使用 https 完全多余。显然冗余安全性很差,所以我将其设置为 no...并且它无法连接。

那么,真的有人有任何链接,或者可以抽出一些时间自己来填补我对这些东西如何工作的知识空白吗?这将不胜感激,并且不会让我从老板那里得到悲伤。



Best Answer-推荐答案


这需要由 AFNetworking 处理,称为“SSL Pinning”。查看文档 here有关如何启用该功能并提供您的证书的详细信息。还有有用的信息here .

关于ios - SSL 证书混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21870770/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4