gpt4 book ai didi

iphone - 将客户端证书导入 iPhone 的钥匙串(keychain)

转载 作者:可可西里 更新时间:2023-11-01 05:38:42 26 4
gpt4 key购买 nike

我正在编写一个与服务器通信的应用程序,该服务器要求客户端使用客户端证书对自身进行身份验证。我需要从应用程序包中的 .p12 文件中提取证书并将其添加到应用程序钥匙串(keychain)中。

我一直在努力弄清楚如何让它从 Apple 的 "Certificate, Key, and Trust Services Tasks for iOS" 开始工作。 ,但对我来说它似乎不完整并且没有指定我如何向钥匙串(keychain)添加任何东西(?)。

我很迷茫,需要任何帮助,在此先感谢!

最佳答案

Certificate, Key, and Trust Services Tasks for iOS”确实包含从 .p12 文件中提取证书的足够信息。

  • list 2-1 演示了如何提取 SecIdentityRef

  • list 2-2 第二行 (//1) 显示了如何复制SecCertificateRef 来自 SecIdentityRef。

示例 加载 p12 文件、提取证书、安装到钥匙串(keychain)。(不包括错误处理和内存管理)

  NSString * password = @"Your-P12-File-Password";
NSString * path = [[NSBundle mainBundle]
pathForResource:@"Your-P12-File" ofType:@"p12"];

// prepare password
CFStringRef cfPassword = CFStringCreateWithCString(NULL,
password.UTF8String,
kCFStringEncodingUTF8);
const void *keys[] = { kSecImportExportPassphrase };
const void *values[] = { cfPassword };
CFDictionaryRef optionsDictionary
= CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1,
NULL, NULL);

// prepare p12 file content
NSData * fileContent = [[NSData alloc] initWithContentsOfFile:path];
CFDataRef cfDataOfFileContent = (__bridge CFDataRef)fileContent;

// extract p12 file content into items (array)
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus status = errSecSuccess;
status = SecPKCS12Import(cfDataOfFileContent,
optionsDictionary,
&items);
// TODO: error handling on status

// extract identity
CFDictionaryRef yourIdentityAndTrust = CFArrayGetValueAtIndex(items, 0);
const void *tempIdentity = NULL;
tempIdentity = CFDictionaryGetValue(yourIdentityAndTrust,
kSecImportItemIdentity);

SecIdentityRef yourIdentity = (SecIdentityRef)tempIdentity;


// get certificate from identity
SecCertificateRef yourCertificate = NULL;
status = SecIdentityCopyCertificate(yourIdentity, &yourCertificate);


// at last, install certificate into keychain
const void *keys2[] = { kSecValueRef, kSecClass };
const void *values2[] = { yourCertificate, kSecClassCertificate };
CFDictionaryRef dict
= CFDictionaryCreate(kCFAllocatorDefault, keys2, values2,
2, NULL, NULL);
status = SecItemAdd(dict, NULL);

// TODO: error handling on status

关于iphone - 将客户端证书导入 iPhone 的钥匙串(keychain),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339510/

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