gpt4 book ai didi

objective-c - iOS - 以编程方式安装 SSL 证书

转载 作者:IT王子 更新时间:2023-10-29 08:06:43 26 4
gpt4 key购买 nike

我正在编写一个 phonegap 插件,用于在应用程序钥匙串(keychain)中安装 CA 根证书和用户证书。

这是用于安装证书的代码:

NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:certpath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;
CFStringRef password = (CFStringRef)certPassword;
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import(inPKCS12Data, optionsDictionary, &items);
if (securityError == 0) {
NSLog(@" *** Certificate install Success ***");
} else {
NSLog(@" *** Certificate install Failure ***");
}

上面的代码工作正常(securityError 等于 0)。但是,我收到了这些错误:

unknown apsd[59] <Warning>: <APSCourier: 0xee1ba80>: Stream error occurred for <APSTCPStream: 0x126940>: TLS Error Code=-9844 "peer dropped connection before responding"
unknown securityd[638] <Error>: CFReadStream domain: 12 error: 8

这表明设备不接受安装的证书,所以我想知道该证书未根据设备上安装的 CA 根证书进行验证。

我是否必须为该应用安装 CA 根证书?

有什么想法吗?

P.S:我是 Objective-C 和 XCode 环境的新手。

编辑:

下面的代码用于将 CA 根证书存储在钥匙串(keychain)中:

NSString *rootCertPath = [[NSBundle mainBundle] pathForResource:@"rootca" ofType:@"cer"];
NSData *rootCertData = [NSData dataWithContentsOfFile:rootCertPath];

OSStatus err = noErr;
SecCertificateRef rootCert = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef) rootCertData);

CFTypeRef result;

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassCertificate, kSecClass,
rootCert, kSecValueRef,
nil];

err = SecItemAdd((CFDictionaryRef)dict, &result);

if( err == noErr) {
NSLog(@"Install root certificate success");
} else if( err == errSecDuplicateItem ) {
NSLog(@"duplicate root certificate entry");
} else {
NSLog(@"install root certificate failure");
}

编辑:

似乎证书没有发送到服务器。我认为每次发出 https 请求时我都必须手动发送证书...我正在寻找一种方法来捕获 phonegap 中的每个 https 调用。

最佳答案

将证书导入钥匙串(keychain)是不够的。新的根证书也得到了用户或系统的信任。

假设您在变量 certificate 中仍然有 SecCertificateRef,请使用以下代码提高信任级别:

NSDictionary *newTrustSettings = @{(id)kSecTrustSettingsResult: [NSNumber numberWithInt:kSecTrustSettingsResultTrustRoot]};
status = SecTrustSettingsSetTrustSettings(certificate, kSecTrustSettingsDomainUser, (__bridge CFTypeRef)(newTrustSettings));
if (status != errSecSuccess) {
NSLog(@"Could not change the trust setting for a certificate. Error: %d", status);
exit(0);
}

更改信任级别将在弹出窗口中询问用户是否接受更改。

关于objective-c - iOS - 以编程方式安装 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12798950/

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