gpt4 book ai didi

ios - 为 MCSession 授权证书

转载 作者:行者123 更新时间:2023-11-28 20:02:44 24 4
gpt4 key购买 nike

我在钥匙串(keychain)中创建了一个自签名证书,我正在使用 MultipeerConnectivity 框架在设备之间传输数据。

当我们创建 session 时,我们可以在 MCSession 中邀请同行时传递 securityIdentity。

  - (instancetype)initWithPeer:(MCPeerID *)myPeerID securityIdentity:(NSArray *)identity encryptionPreference:(MCEncryptionPreference)encryptionPreference;

但是securityIdentity是NSArray,我们如何在NSArray中传递证书,如何在NSArray中进行身份验证

- (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:(MCPeerID *)peerID certificateHandler:(void(^)(BOOL accept))certificateHandler;

最佳答案

它是一个包含信息的数组,这些信息可用于向附近的其他对等点识别本地对等点。

该数组包含有助于向其他人识别对等点的对象。第一个是具有 SecKeyRef 对象和相关 SecCertificateRef 对象的 SecIdentityRef 对象。 (类似于苹果开发者证书和私钥对)

数组中的其他元素可以是 SecCertificateRef 对象,表示验证 SecIdentityRef 可能需要的中间证书。

接收方必须验证 SecIdentityRef 所代表的身份。

下面是从p12文件中获取SecIdentityRef的代码

- (SecIdentityRef)getClientCertificate 
{
SecIdentityRef identity = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *myFilePath = [documentsDirectoryPath stringByAppendingPathComponent:@"cert_key_pair.p12"];
NSData *PKCS12Data = [NSData dataWithContentsOfFile:myFilePath];

CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;
CFStringRef password = CFSTR("password");
const void *keys[] = { kSecImportExportPassphrase };//kSecImportExportPassphrase };
const void *values[] = { password };
CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items);
CFRelease(options);
CFRelease(password);
if (securityError == errSecSuccess) {
NSLog(@"Success opening p12 certificate. Items: %ld", CFArrayGetCount(items));
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
identity = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
} else {
NSLog(@"Error opening Certificate.");
}

return identity;
}

获取策略引用对象并评估信任

- (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:     (MCPeerID *)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler
{
SecCertificateRef myCert;
myCert = [certificate objectAtIndex:0]; // 1

SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); // 2

SecCertificateRef certArray[1] = { myCert };
CFArrayRef myCerts = CFArrayCreate(
NULL, (void *)certArray,
1, NULL);
SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
myCerts,
myPolicy,
&myTrust); // 3

SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(myTrust, &trustResult); // 4
}
//...
if (trustResult == kSecTrustResultConfirm || trustResult == kSecTrustResultProceed || trustResult == kSecTrustResultUnspecified) // 5
{
certificateHandler(YES);
}

// ...
if (myPolicy)
CFRelease(myPolicy);
}

关于ios - 为 MCSession 授权证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23253166/

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