问题描述
当我尝试在真实设备上运行单元测试时,它会失败。
返回的错误是
-25293(“您输入的用户名或密码不正确。”)
这是我失败的代码:
let accessControl = SecAccessControlCreateWithFlags(
kcfAllocatorDefault,kSecAttrAccessibleAfterFirstUnlock,[.privateKeyUsage],nil)
let privateKeyAttrs = [
kSecAttrIsPermanent as String : true,kSecAttrApplicationTag as String : tag,kSecAttrAccessControl as String : accessControl
] as [String : Any]
let generationQuery: [String: Any] = [
kSecAttrKeyType as String : kSecAttrKeyTypeRSA,kSecAttrKeySizeInBits as String : 2048,kSecPrivateKeyAttrs as String : privateKeyAttrs]
var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreaterandomKey(generationQuery as CFDictionary,&error) else {
throw <MyError>
}
即使我将Accessible保护更改为kSecAttrAccessibleAlways或kSecAttrAccessibleWhenUnlocked,并且我只是从我的privateKeyAttrs中删除了kSecAttrAccessControl,我的测试还是通过了,SecKeyCreaterandomKey仍然失败。
更多详细信息:如果我在模拟器上运行测试,它将通过;我正在使用 Xcode 11.6和Swift 5。
解决方法
.privateKeyUsage
专用于创建存储在Secure Enclave中的密钥对:
尝试在Secure Enclave外部生成密钥对时使用此约束的尝试失败。
放弃该选项。如果您只是想在钥匙串中创建钥匙对,则不需要它(也不能使用它)。