[Résolu] Archiver (?) un SecIdentityRef
Hello tout le monde
J'aurais besoin de stocker un SecIdentityRef (certificate + key) dans mon NSDocument, afin de conserver la référence quand on ferme le document et qu'on le réouvre plus tard.
Et je suis un peu perdu, je sais pas trop comment ça s'archive.
Alors je récupère mon identity via un SecItemCopyMatching() dont le result array est passé à un SFChooseIdentityPanel.
Voici comment je récupère la liste des Identity que j'affiche dans mon panel :
- (NSArray *)identities
{
NSDictionary *query = @{
(id)kSecClass:(id)kSecClassIdentity,
(id)kSecMatchLimit:(id)kSecMatchLimitAll,
(id)kSecReturnRef:(id)kCFBooleanTrue
};
NSArray *resultArray = nil;
CFArrayRef identities = NULL;
if (noErr == SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&identities)) {
resultArray = (__bridge_transfer NSArray*)identities;
}
return resultArray;
}
Alors j'ai ptet une piste avec le "kSecReturnRef", je pourrais mettre "kSecReturnPersistentRef" ou "kSecReturnData" pour avoir des data et donc archiver, mais du coup je sais pas si ça fonctionnera, ou comment il faut faire, pour utiliser avec ma socket (ligne 2) :
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:@[;(__bridge id)_identity] forKey:(NSString *)kCFStreamSSLCertificates];
[options setObject:host forKey:(NSString *)kCFStreamSSLPeerName];
[_socket startTLS:options];
Bref voilà , je sais pas trop comment faire donc je m'en remet un peu à vous
Question Bonus : j'aimerais un moyen élégant pour que quand on transfère mon NSDocument d'un Mac à un autre, l'identité (certificate + key) suive avec, avec le plus de transparence possible pour l'utilisateur.
Merci d'avance !
Réponses
Ici :
http://stackoverflow.com/questions/10140244/store-secidentityref-into-nsuserdefaults
Cela pose un petit problème de sécurité si tu stockes l'identité sans mot de passe (à moins que le NSData soit chiffré avec un mot de passe, quand tu le récupères, je ne sais pas trop...)
Sinon tu peux aussi créer un fichier .keychain protégé par mot de passe pour stocker ou transférer ton identité d'un mac à l'autre avec SecKeychainCreate ou un fichier p12.
Théoriquement il faudrait plutot demander à l'utilisateur d'autoriser ton application à accéder au keychain et laisser l'identité bien en sécurté dans le keychain.
https://github.com/blommegard/APNS-Pusher/blob/master/APNS%20Pusher/SBAppDelegate.m
Ensuite tu peux importer ton fichier .p12 sur l'autre Mac avec :
SecPKCS12Import
Le fichier p12 étant protégé par mot de passe (que tu demandes à l'utilisateur), t'es propre au niveau sécurité.
Ensuite sur chaque mac, tu laisses ton identité dans le keychain de l'utilisateur et tu demandes l'accès pour ton application (je ne sais pas si c'est automatique quand tu essayes d'ouvrir le keychain ou s'il faut utiliser SecAccessCreate et/ou SecTrustedApplicationCreateFromPath).
Alors je viens donner des nouvelles, comme elles ont justement été réclamées sur un autre post
Du coup je fais un mix des deux : je fais persister par des NSData les certificates. Mais je vais mettre deux options dans le menu pour exporter et importer le p12 dans le cas où on veut utiliser le document sur un autre Mac.
Donc merci FKDev