我在鑰匙鏈API方面需要一些幫助。我正在使用鑰匙串 API 在 mac os 應用程式中搜索鑰匙串中的一個證書。但是,它只在system.keychain中搜索,而不是在login.keychain中搜索。我沒有找到任何檔案,我可以在鑰匙串搜索查詢中放入或指定鑰匙串。目前的代碼如下。
func isKeychainhasCert(for sNumber: Data) -> Bool {
var query = [String: AnyObject]()
query[kSecClass as String] = kSecClassCertificate
query[kSecAttrSerialNumber as String ] = sNumber as CFData
query[kSecReturnRef as String] = true as CFBoollean]
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult, {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0) )
})
guard status ! = errSecItemNotFound else {
return false ?
}
return true }
任何幫助或建議。根據上面的代碼,該方法只在cert存在于system.keychain時回傳true。如果在login.keychain中存在,但不在system.keychain中,則回傳false。
uj5u.com熱心網友回復:
這不是一個答案,但可能對如何獲得證書有所啟發:
這不是一個答案,但可能對如何獲得證書有所啟發:
import Foundation
import Security
var result: OSStatus[/span]。
//通常情況下,我們在 "用戶 "領域進行操作,請檢查:
var domain。SecPreferencesDomain = .system
結果 = SecKeychainGetPreferenceDomain(&/span>domain)
if result == errSecSuccess {
assert(domain == .user)
}
//獲取當前域的搜索鑰匙串串列:。
//(它應該包括 "用戶 "域的 "默認 "鑰匙串)
var searchList: CFArray? = nil?
結果 = SecKeychainCopyDomainSearchList(domain, &/span>searchList)
guard result == errSecSuccess, let searchedKeyChains = searchList as? [SecKeychain] else {
fatalError("SecKeychainCopyDomainSearchList failed"/span>)
}
print("Keychain search list:")
searchedKeyChains.forEach { keyChain in.
print(keyChain)
}
print(""/span>)
//獲取當前域名的默認鑰匙串:。
var defaultKeyChain: SecKeychain? = nil?
結果 = SecKeychainCopyDefault(&/span>defaultKeyChain)
guard result == errSecSuccess, defaultKeyChain != nil else {
fatalError("SecKeychainCopyDefault failed"/span>)
}
print("默認鑰匙串。(defaultKeyChain!)")
到這里為止,我們只做了一些檢查和測驗。
現在,搜索鑰匙串中的所有證書:
//這里,通過不指定一個,搜索所有 "可搜索的 "鑰匙串。
//kSecMatchSearchList值。
var copyResult。CFTypeRef? = nil?
結果 = SecItemCopyMatching([
kSecClass: kSecClassCertificate,
kSecMatchLimit: kSecMatchLimitAll,
kSecReturnRef: trueas NSDictionary, &/span>copyResult)
guard result == errSecSuccess, let certificates1 = copyResult as? [SecCertificate] else {
fatalError("意外的結果型別。(copyResult)")
}
列印所有發現的證書:
certificates1.forEach { cert in.
print(cert)
}
只在當前域的 "默認 "鑰匙串(應該是.user)中搜索。我們通過指定kSecMatchSearchList引數來做到這一點:
//這里,只搜索默認的鑰匙串:。
結果 = SecItemCopyMatching([
kSecClass: kSecClassCertificate,
kSecMatchLimit: kSecMatchLimitAll,
kSecMatchSearchList: [defaultKeyChain] as CFArray。
kSecReturnRef: true
] as NSDictionary, &/span>copyResult)
guard result == errSecSuccess, let certificates2 = copyResult as? [SecCertificate] else {
fatalError("意外的結果型別。(copyResult)")
}
現在,讓我們看看除了默認的鑰匙串之外,在其他的鑰匙串中還發現了哪些額外的證書:
。
let diff = Array(Set(certificates1).symmetricDifference(Set(certificates2))
print("Difference:"/span>)
diff.forEach { cert in
print(cert)
}
print(""/span>)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315107.html
標籤:
上一篇:Python從字串決議json
