2012-04-05 6 views
10

Ho risolto il mio problema precedente di conversione della chiave privata XML RSA in un file PEM, ma mi imbatto in un altro problema che ottengo dati null durante l'importazione della chiave privata P12. Di seguito è riportato i miei passi:Come rendere un file p12 valido per essere importato correttamente da SecPKCS12Import

  1. Converti file PEM al file P12

    openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
    
  2. Leggi file P12 al progetto iOS

    NSString *path = [[NSBundle bundleForClass:[self class]]  
            pathForResource:@"MyPrivateKey" ofType:@"p12"]; 
    NSData *p12data = [NSData dataWithContentsOfFile:path]; 
    if (![self getPrivateKeyRef]) 
        RSAPrivateKey = getPrivateKeywithRawKey(p12data); 
    
  3. Importa P12 chiave privata

    SecKeyRef getPrivateKeywithRawKey(NSData *pfxkeydata) 
    { 
        NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease]; 
    
        // Set the public key query dictionary 
        //change to your .pfx password here 
        [options setObject:@"MyPassword" forKey:(id)kSecImportExportPassphrase]; 
    
        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
    
        OSStatus securityError = SecPKCS12Import((CFDataRef) pfxkeydata, 
                  (CFDictionaryRef)options, &items); 
    
        CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); 
        SecIdentityRef identityApp = 
        (SecIdentityRef)CFDictionaryGetValue(identityDict, 
                 kSecImportItemIdentity); 
        //NSLog(@"%@", securityError); 
    
        assert(securityError == noErr); 
        SecKeyRef privateKeyRef; 
        SecIdentityCopyPrivateKey(identityApp, &privateKeyRef); 
    
        return privateKeyRef; 
    
    } 
    

Pensavo che non ci fossero errori (il valore di OSStatus è 0), ma l'array di elementi non ha ottenuto alcun dato di identità. Mi chiedo se non ho ottenuto il formato di file p12 corretto a causa dell'errato utilizzo di OpenSSl. Qualcuno ha importato con successo il file p12? Ho bloccato questo problema per un paio di giorni, ti prego di darmi consigli se hai degli indizi, grazie!

Hubert

+0

A proposito di OpenSSL utilizzo: 1) La chiave di ingresso non sarà sicuramente lo stesso del vostro certificato di ingresso 2) doc dice '-nocerts' creerà alcun certificato in uscita; hai provato senza di essa? – MrTJ

risposta

8

ho ricevuto alcuni suggerimenti da Internet, e che segue è la procedura per ottenere iOS accettabili chiave p12 e certificazione del file:

  1. convertire XML per PEM
    Shell> compilare XMLSpec2PEM. java
    Shell> XMLSpec2PEM rsa.xml
    salvare il risultato in uscita a rsa.pem
    (in prestito da here)

  2. convertito PEM alla RSA chiave privata
    OpenSSL> rsa -in rsa.pem -out rsaPrivate.key

  3. generare una richiesta di certificazione
    OpenSSL> req -new tasto rsaPrivate.key -out rsaCertReq .crt
    (ingresso alcuni dati di certificazione di base)

  4. certificazione Segno della richiesta
    OpenSSL> x509 -req -days 3650 -in rsaCertReq.crt -signkey rsaPrivate.key -out RSAC ert.crt

  5. convertire il formato di file di certificazione per DER (formato accettabile iOS)
    OpenSSL> x509 -outform der -in rsaCert.crt -out rsaCert.der

  6. Generare PKCS12 chiave privata (formato accettabile iOS)
    OpenSSL> pkcs12 -export -out rsaPrivate.pfx -inkey rsaPrivate.key -in rsaCert.crt

ulteriori misure, file generi ted in step 5 e 6 ora può essere utilizzato in iOS!

di riferimento delle istruzioni di OpenSSL:
http://blogs.yaclife.com/?tag=ios%E3%80%80seckeyref%E3%80%80raw%E3%80%80key%E3%80%80rsa%E3%80%803des

http://devsec.org/info/ssl-cert.html

+1

Grazie per aver segnalato Hubert. Questo è un modo terribilmente tondo per convertire una chiave privata codificata XML in una rappresentazione interna, ma dovrebbe essere corretta e non sono sicuro se c'è un modo più solido (al di fuori di scrivere la routine di conversione nell'Object C, ovviamente). Oh, puoi accettare le tue risposte dopo un po '! –

+0

Suppongo che la risposta sia sì. Quello che ho fatto sopra è semplicemente utilizzare lo strumento da riga di comando openssl per convertirlo in un formato chiave valido, quindi è possibile eseguire le operazioni con openssl api. Non l'ho fatto semplicemente perché ho solo bisogno di farlo una volta. –

+0

Nel mio caso, il passaggio 2 "convertire PEM in chiave privata RSA" ha prodotto lo stesso file di output del file di input. Tuttavia, il file p12 prodotto dopo aver seguito tutti i passaggi era esattamente ciò di cui avevo bisogno per la mia app iOS e trovare questo post è stato di grande aiuto. –

Problemi correlati