L'ajout de la clé privée dans iOS Trousseau
Je suis en train d'ajouter une clé privée dans l'iOS trousseau de clés. Le certificat de clé publique) fonctionne très bien mais la clé privée refuse... je suis totalement confus pourquoi le code suivant ne fonctionne pas.
D'abord je vérifie si la clé actuelle (=clé en cas de que le Trousseau est un magasin de clé/valeur) est "libre" dans le Trousseau d'accès. Ensuite, je vais ajouter la clé privée.
CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);
NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil];
NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil];
NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys];
CFRelease(labelstring);
NSMutableDictionary *query = searchdict;
CFTypeRef item = NULL;
OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item);
if (error)
{
NSLog(@"Error: %ld (statuscode)", error);
}
if(error != errSecItemNotFound)
{
SecItemDelete((__bridge_retained CFDictionaryRef) query);
}
[query setObject:(id)data forKey:(__bridge id)kSecValueData];
OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item);
if(status)
{
NSLog(@"Keychain error occured: %ld (statuscode)", status);
return NO;
}
La sortie de débogage est la suivante:
2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode)
2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode)
Le premier code d'erreur -25300
représente errSecItemNotFound
. Donc, il n'y a pas de valeur stockée pour cette clé. Puis, lorsque j'essaie d'ajouter la clé privée dans le Trousseau je obtenir -25299
qui signifie errSecDuplicateItem
. Je ne comprends pas cette. Pourquoi est-ce arrivé?
Quelqu'un a une idée ou une astuce à ce sujet?
Apple codes d'erreur:
errSecSuccess = 0, /* No error. */
errSecUnimplemented = -4, /* Function or operation not implemented. */
errSecParam = -50, /* One or more parameters passed to a function where not valid. */
errSecAllocate = -108, /* Failed to allocate memory. */
errSecNotAvailable = -25291, /* No keychain is available. You may need to restart your computer. */
errSecDuplicateItem = -25299, /* The specified item already exists in the keychain. */
errSecItemNotFound = -25300, /* The specified item could not be found in the keychain. */
errSecInteractionNotAllowed = -25308, /* User interaction is not allowed. */
errSecDecode = -26275, /* Unable to decode the provided data. */
errSecAuthFailed = -25293, /* The user name or passphrase you entered is not correct. */
Merci d'avance!
Mise à jour #1: j'ai compris que cela ne fonctionne que pour la première fois. Même lorsque les données et la clé est différente, après la première fois stockées dans le trousseau je ne peut pas stocker plus de touches.
- Je me pose exactement la même question. Première clé ajoutés à l'aide de SecItemAdd sans problème, puis une période consécutive de l'appel à SecItemAdd échoue avec errSecDuplicateItem bien que malgré SecItemCopyMatching retour errSecItemNotFound. Avez-vous trouvé une solution à cela?
Vous devez vous connecter pour publier un commentaire.
Le code suivant fonctionné pour moi:
SecItemAdd
il y a eu aussiSecItemUpdate
et de deviner ce que c'est bon pour. Au lieu de créer un nouvel élément, consultez d'abord, il existe déjà et il ne fait, de mettre à jour l'élément existant. Uniquement créer un nouvel élément s'il n'existe aucun élément à mettre à jour.key
est un SecKeyRef et la clé privée pour enregistrer. Qu'est-ce quedata
?Désolé mais je ne serai jamais capable de déboguer votre code. Apple fournit un exemple de code (KeychainItemWrapper) qui permet d'enregistrer une chaîne (je me souviens). Son une grande aide concernant la chaîne de la clé. Il y a un résumé de l'information sur le web qui est une version modifiée de cette classe, mais enregistre et restaure un dictionnaire (archivé comme un objet de données, qui est ce que la Pomme de code pour la chaîne). Cela vous permet d'économiser plusieurs éléments dans une seule interface pour le trousseau. L'essentiel est ici Trousseau de clés pour NSDictionary/données
kSecClassKey
(et le certificat correspondant danskSecClassCertificate
). Je sais que Apple fournit cet exemple de code pour le stockage des informations d'identification d'utilisateur (mais uniquement des chaînes de caractères) dans le trousseau d'accès. Considérant, que l'on veut vérifier un certificat ou de l'utilisation de la protection complémentaire de lakSecClassKey
il ne peut pas obtenir stocké à l'aide de l'approche d'Apple est un exemple de code ou de votre lien. Cependant, je pense avoir trouvé une solution, mais à vérifier, avant de me le poster ici.