gpt4 book ai didi

ios - 用于在 iOS 上运行 HTTPS 服务器的 SSL 身份证书

转载 作者:可可西里 更新时间:2023-11-01 03:56:21 24 4
gpt4 key购买 nike

我正在尝试在 iOS 应用程序中构建一个HTTPS 服务器,以便充当我的网络应用程序和外部服务器之间的代理。

我已经设法通过监听套接字创建了一个 HTTP 服务器,这要归功于 CFSocketRef 或使用 GCDAsyncSocket 库。我还成功地使用 GCDAsyncSocket 库制作了一个运行 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)访问创建的自签名服务器 SSL 证书。所以我明白我必须给系统一个配置集,其中包含一个包含身份和证书的数组。它在我的 Mac 应用程序上运行良好。

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

如何在 iOS 上创建 SecIdentityRef(启用 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 内容将在 keystore 数组中。

关于ios - 用于在 iOS 上运行 HTTPS 服务器的 SSL 身份证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9874932/

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