Ios macOS Catalina中的密钥链共享问题
我有两个Mac应用程序。我的要求是创建一个RSA非对称私钥,并将其存储到App 1的默认登录密钥链中。现在,当应用程序2尝试检索此密钥时,它应该能够在没有任何登录提示的情况下检索此密钥(当应用程序(非所有者)尝试访问它时,密钥链要求登录) 为了解决这个问题,我尝试的第一个解决方案是在创建密钥时编辑ACL(访问控制列表),并包括尝试访问该密钥的应用程序。这同样有效。但是,由于TrustedApplication是使用SecTrustedApplicationCreateFromPath API创建的,因此无法使用此选项。该API在10.15中已被弃用,无法创建SecTrustedApplication,我们将无法再使用它。苹果没有提到其他选择。自Catalina(10.15)以来,苹果似乎不再希望用户在不要求用户提示的情况下从应用程序中操纵ACL 因此,我最终实施的解决方案是钥匙链共享,我遵循了苹果的文档: 应用程序1创建密钥并将私钥保存在密钥链中。应用程序2尝试访问它并从中生成公钥。 我已经在这两个应用中创建了密钥链访问组,并确保这两个应用的应用标识符前缀相同 从应用程序1创建密钥的属性:Ios macOS Catalina中的密钥链共享问题,ios,macos,security,keychain,Ios,Macos,Security,Keychain,我有两个Mac应用程序。我的要求是创建一个RSA非对称私钥,并将其存储到App 1的默认登录密钥链中。现在,当应用程序2尝试检索此密钥时,它应该能够在没有任何登录提示的情况下检索此密钥(当应用程序(非所有者)尝试访问它时,密钥链要求登录) 为了解决这个问题,我尝试的第一个解决方案是在创建密钥时编辑ACL(访问控制列表),并包括尝试访问该密钥的应用程序。这同样有效。但是,由于TrustedApplication是使用SecTrustedApplicationCreateFromPath API创建
NSString *accessGroup = [NSString stringWithFormat:@"%@com.sample.keychaingroup",appIdentifierPrefix];
NSDictionary*属性=@{
(id)kSecAttrLabel:@“样本私钥”,
(id)kSecAttrKeyType:(id)kSecAttrKeyTypeRSA,
(id)kSecAttrKeySizeInBits:@(2048),
(id)kSecAttrAccessGroup:accessGroup,
(id)kSecPrivateKeyAttrs:
@{
(id)kSecAttrApplicationTag:tag,
(id)kSecAttrIsPermanent:@是,
(id)ksecattrisectractable:@是,
(id)kSecAttrDescription:@“示例密钥描述”,
},
密钥是使用以下方法创建的:
SecKeyRef privateKey=SecKeyCreateRandomKey((_桥CFDictionaryRef)属性,&错误)
创建部分工作得非常好,我可以在密钥链中看到密钥(示例私钥)
现在,要从应用程序2访问此应用程序,我使用以下工具:
NSDictionary *queryDict = @{
(id)kSecClass: (id)kSecClassKey,
(id)kSecAttrKeyType: (id)kSecAttrKeyTypeRSA,
(id)kSecReturnRef: @YES,
(id)kSecAttrApplicationTag: same tag used above,
(id)kSecUseDataProtectionKeychain: @YES,
};
OSStatus status=SecItemCopyMatching((_-bridge-CFDictionaryRef)queryDict,(CFTypeRef*)&fullKey);
在这里,我总是收到状态为-25300(errSecItemNotFound),这意味着在密钥链中找不到该项
这里使用KSecuarProtectionKeychain是因为根据苹果公司的文档,在Mac中使用Keychain共享需要它
在这里,我尝试了n个排列和组合来进行查询,但始终没有成功。如果我删除KSecuarProtectionKeyChain,它会像前面一样工作。当我们尝试访问公钥时,它会显示提示。我们得到了fullKey值,但下面的方法会显示提示。我还尝试在二英,但都没用
SecKeyRef publicKey=SecKeyCopyPublicKey(fullKey);
我不知道到底是哪里出了问题,我觉得自己被困在这里了。如果有人对此有任何见解,请分享你的想法
NSDictionary *queryDict = @{
(id)kSecClass: (id)kSecClassKey,
(id)kSecAttrKeyType: (id)kSecAttrKeyTypeRSA,
(id)kSecReturnRef: @YES,
(id)kSecAttrApplicationTag: same tag used above,
(id)kSecUseDataProtectionKeychain: @YES,
};