Importo il mio ID digitale (certificato X.509 e chiave privata per la firma, la verifica, la crittografia e la decrittografia dei messaggi) nel portachiavi. Nella GUI vedo il mio certificato e la chiave corrispondente e posso modificare le loro descrizioni e posso scrivere una nota che ne descriva l'utilizzo, ecc.
Tuttavia, quando Mail.app tenta di accedere alla chiave privata mostra una finestra di dialogo che dice "La posta vuole utilizzare le informazioni riservate memorizzate in" privateKey "nel portachiavi.".
Ora ho più ID digitali per indirizzi diversi, in modo che il messaggio non mi dia alcuna idea della chiave a cui tenta di accedere. Ho studiato un po 'e si è scoperto che quando si importa una chiave viene creata anche una lista ACL all'interno del portachiavi. Ogni voce in quell'elenco ACL ha una descrizione facoltativa. Credo che quando non c'è una descrizione definita, la finestra di dialogo menzionata userà la descrizione della chiave, ma se c'è una descrizione ACL verrà invece usata.
Quando eseguo il dump del mio portachiavi con "security dump-keychain -a" ottengo il seguente:
keychain: "/Users/galaxy/Library/Keychains/login.keychain"
class: 0x00000010
attributes:
0x00000000 <uint32>=0x00000010
0x00000001 <blob>=0x646[...]00 "[email protected][galaxy@home:~/xcode/Security-55471.14.18/libsecurity_pkcs12/lib]$ grep -B5 -A5 '"privateKey"' pkcs12Crypto.cpp
try {
CssmClient::KeyAclBearer bearer(
cspHand, *privKey, Allocator::standard());
SecPointer<KeychainCore::Access> initialAccess(access ?
KeychainCore::Access::required(access) : /* caller-supplied */
new KeychainCore::Access("privateKey")); /* default */
initialAccess->setAccess(bearer, maker);
}
catch (const CssmError &e) {
/* not implemented means we're talking to the CSP which does
* not implement ACLs */
0"
0x00000002 <blob>=<NULL>
[...]
0x0000001A <uint32>=0x00000001
access: 3 entries
entry 0:
authorizations (1): encrypt
don't-require-password
description: privateKey
applications: <null>
entry 1:
authorizations (6): decrypt derive export_clear export_wrapped mac sign
don't-require-password
description: privateKey
applications (0):
entry 2:
authorizations (1): change_acl
don't-require-password
description: privateKey
applications (0):
Prima di tutto, voglio cambiare la descrizione da "privateKey" a "[email protected] (Encryption)" per ACL entry 0. Ho cercato molto, ma finora ho trovato solo riferimenti a OS X API per fare così. C'è uno strumento per farlo? Se non esiste uno strumento di questo tipo, come posso configurarlo al momento dell'importazione? Lo chiedo da quando StartSSL obbliga automaticamente Safari ad importare l'ID digitale, la descrizione ACL è impostata su "www.startssl.com", quindi so che è possibile configurarlo.
Infine, una domanda bonus è che esiste uno strumento o un modo per personalizzare gli ACL? Ad esempio, desidero eliminare export_ * dall'ACL della voce 1 (ho visto anche quello fatto da StartSSL con i loro ID digitali).
AGGIORNAMENTO: Da quando Apple ha rilasciato la sua GUI di accesso Portachiavi come Open Source ho controllato le fonti per l'importazione di PKCS # 12 e lì hanno un'opzione per impostare la descrizione e gli ACL al momento dell'importazione. Tuttavia, non ho mai codificato nulla per OS X ed è difficile capire quale condizione dovrebbe essere soddisfatta per ottenere la descrizione degli ACL e degli ACL stessi al momento dell'importazione. La logica si trova nel pacchetto Security in pkcs12Crypto.cpp:
keychain: "/Users/galaxy/Library/Keychains/login.keychain"
class: 0x00000010
attributes:
0x00000000 <uint32>=0x00000010
0x00000001 <blob>=0x646[...]00 "[email protected][galaxy@home:~/xcode/Security-55471.14.18/libsecurity_pkcs12/lib]$ grep -B5 -A5 '"privateKey"' pkcs12Crypto.cpp
try {
CssmClient::KeyAclBearer bearer(
cspHand, *privKey, Allocator::standard());
SecPointer<KeychainCore::Access> initialAccess(access ?
KeychainCore::Access::required(access) : /* caller-supplied */
new KeychainCore::Access("privateKey")); /* default */
initialAccess->setAccess(bearer, maker);
}
catch (const CssmError &e) {
/* not implemented means we're talking to the CSP which does
* not implement ACLs */
0"
0x00000002 <blob>=<NULL>
[...]
0x0000001A <uint32>=0x00000001
access: 3 entries
entry 0:
authorizations (1): encrypt
don't-require-password
description: privateKey
applications: <null>
entry 1:
authorizations (6): decrypt derive export_clear export_wrapped mac sign
don't-require-password
description: privateKey
applications (0):
entry 2:
authorizations (1): change_acl
don't-require-password
description: privateKey
applications (0):
Sfortunatamente in tutti i miei tentativi di importazione sto ancora colpendo quella descrizione "privateKey" codificata e quando ho, diciamo, 5 diversi ID digitali, tutti richiedono l'accesso con "privateKey" nella finestra di dialogo ed è confuso.