SSL身份证书在iOS上运行HTTPS服务器

我正在尝试在iOS应用程序中构buildHTTPS服务器,以充当我的Web应用程序和我的外部服务器之间的代理。

我设法通过侦听套接字来创build一个HTTP服务器,感谢CFSocketRef或使用GCDAsyncSocket库。 我也成功地使用GCDAsyncSocket库来创build一个运行HTTPS服务器的Mac应用程序,并感谢我的方法“secureSocket:”,它保证了连接的安全:

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket { // (...) // secure the connection [self secureSocket:newSocket]; // (...) } - (void)secureSocket:(GCDAsyncSocket *)sock { // The root self-signed certificate I have created NSString *certificatePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"]; NSData *certData = [[NSData alloc] initWithContentsOfFile:certificatePath]; CFDataRef certDataRef = (CFDataRef)certData; SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef); [certData release]; // the "identity" certificate SecIdentityRef identityRef; SecIdentityCreateWithCertificate(NULL, cert, &identityRef); // the certificates array, containing the identity then the root certificate NSArray *certs = [[NSArray alloc] initWithObjects:(id)identityRef, (id)cert, nil]; // the SSL configuration NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3]; [settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName]; [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots]; [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates]; [settings setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFStreamSSLValidatesCertificateChain]; [settings setObject:(NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString*)kCFStreamSSLLevel]; [settings setObject:certs forKey:(NSString *)kCFStreamSSLCertificates]; [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLIsServer]; [sock startTLS:settings]; [certs release]; } 

我正在使用的证书是我使用Keychain Access创build的自签名服务器SSL证书。 所以我明白,我必须给系统configuration一个包含身份和证书的数组。 而且它在我的Mac应用程序上正常工作。

问题是在我的iOS应用程序的HTTP服务器上启用SSL。 创build身份的方法“SecIdentityCreateWithCertificate()”在iOS上不存在,我不知道如何以另一种方式创build身份。

如何在iOS上创buildSecIdentityRef(启用SSL服务器端)? 我是否错过了将公钥/私钥存储在我的应用程序或其他内容? 非常感谢。

我会发布一个单独的答案,因为评论不适合代码共享。
这是我用来导入我的PKCS12的:

 CFArrayRef keyref = NULL; OSStatus sanityChesk = SecPKCS12Import((__bridge CFDataRef)p12Data, (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObject:password forKey:(__bridge id)kSecImportExportPassphrase], &keyref); if (sanityChesk != noErr) { NSLog(@"Error while importing pkcs12 [%d]", sanityChesk); return nil; } NSArray *keystore = (__bridge_transfer NSArray *)keyref; 

完整的p12内容将位于密钥库数组中。