Come fornire le chiavi private e pubbliche generate da OpenSSL per le app iOS e Android?

4

L'affermazione del problema è: Per fornire i clienti su una rete con singoli privati e amp; Chiavi pubbliche generate su un server tramite cavo (su una connessione HTTPS dopo la registrazione). I clienti sono iOS e amp; App Android e il server sta generando chiavi utilizzando la libreria OpenSSL su PHP. I client procederanno quindi a memorizzare le chiavi per firmare ulteriori comunicazioni.
Nota aggiuntiva:
[1] Le app devono anche avere la chiave pubblica del server per verificare le firme.
[2] Nessuna crittografia verrà effettuata con le chiavi. Basta firmare.

Qual è il modo migliore per fornire le chiavi alle app in modo che possano averle con sé nei formati che supportano in modo nativo? Finora ho letto molti formati e strutture di file per fornire le chiavi, ma chiunque ha esperienza di questa situazione e potrebbe guidare quale formato è il più facile da usare?

    
posta kumar 12.06.2012 - 15:28
fonte

2 risposte

4

Ho fatto qualcosa di simile a questa configurazione e raccomanderei di utilizzare una configurazione PKI X509 più standard su OpenPGP. C'è un po 'di più da capire e vale la pena scrivere script se lo si utilizza spesso, tuttavia si adatta al modello.

In sostanza, si desidera creare la propria Autorità di certificazione (CA). Quando le nuove applicazioni arrivano online creano una chiave privata / pubblica, racchiudono la chiave pubblica in un certificato che fornisce l'identificazione di chi possiede quella chiave e la invia alla CA per essere firmata in una richiesta di firma del certificato (CSR). Questo è il modo standard di accettare nuove chiavi pubbliche senza generare chiavi private sul server. È ovviamente un punto di attacco, ma con gli stessi rischi dell'invio di chiavi alle tue app.

Uno dei principali vantaggi di X509 è il collegamento al server web e HTTPS. La maggior parte (/ tutti) i principali server Web sono in grado di accettare un certificato client e assicurarsi che il certificato sia stato firmato dalla CA prima che raggiunga l'applicazione server e passa la chiave pubblica e il nome del certificato (CN) al server per informazioni specifiche del client.

Ci sono molti posti sul web per aiutare a configurare le CA X509 e come firmare con loro e gestire i certificati client e la maggior parte è scoraggiante, ma penso che a lungo termine questo sia più adatto di PGP.

Modifica per rispondere meglio alle specifiche della domanda:

Identificare il server significa che l'applicazione deve conoscere e fidarsi della CA che dovrebbe essere facilmente conosciuta in anticipo. La connessione tramite HTTPS può verificare che il server sia presentato come host example.com corretto e che il certificato sia firmato con la CA.

Usando questo metodo puoi semplicemente memorizzare la chiave privata e pubblica in un file PEM che è solo testo o una varietà di altri formati a seconda di ciò che funziona meglio per la tua app. Quindi lo inserisci nella tua chiamata al server web come certificato client, questo dipende ovviamente dalla tua libreria http (e non so di Android o ios ') ma sono sicuro che ce l'abbiano. Quindi esegui semplicemente le richieste sul POST o qualsiasi altro mezzo desideri.

    
risposta data 13.06.2012 - 04:36
fonte
4

Non sei completamente sicuro di cosa stai chiedendo; se le tue app supportano nativamente un formato specifico, usa quello. C'è un'app specifica che vorresti chiedere?

Se desideri semplicemente un formato semplice per le app che stai scrivendo, il formato OpenSSH è semplice e intuitivo (e ampiamente utilizzato / supportato). Anche i certificati X.509 sono un po 'più complicati, ma anche ampiamente supportati, anche se questo potrebbe essere un po' oltre lo scopo di ciò che stai cercando di fare (X.509 è una specifica completa per PKI [Public Key Infrastructure] e PMI [Privilege Management Infrastructure]).

OpenPGP ha anche implementazioni gratuite (gnupg), e ha un buon supporto per le librerie / un bel formato di chiave (quando si usa l'armatura ascii).

[OT]: Su una nota semi-offtica, generare la chiave privata lato server e poi darla al client è quasi sempre una cattiva idea che sconfigge lo scopo della crittografia a chiave pubblica / privata. Dovresti invece pre-avviare i client con la chiave pubblica dei server, generare una chiave privata sul client, utilizzare la chiave pubblica dei server per verificare la connessione (se stai già utilizzando TLS hai fatto questa parte) e poi inviare il server la chiave pubblica del client. Inoltre, se stai già utilizzando TLS non sono sicuro del motivo per cui avresti bisogno di un altro livello, quindi, ancora una volta, non so quale caso d'uso avevi in mente.

Esempi

Per ottenere un esempio di ciascun tasto su un sistema Unix / Linux:

OpenSSH: ssh-keygen -t rsa -b 2048 -f filename

GnuPg: gpg --keyserver pgp.mit.edu --recv-key 0xEC2C9934 && gpg --armor --export 0xEC2C9934 (scaricherà e mostrerà la mia chiave pubblica)

X.509: openssl genrsa -sha512 -out keyfile.key 2048 sputerà una chiave privata. È quindi possibile generare una richiesta di firma del certificato utilizzando openssl req -new -key keyfile.key -out keyfile.csr e infine un certificato: openssl x509 -req -days 1 -in keyfile.csr -signkey keyfile.key -out keyfile.crt

Considerazioni finali

Dopo aver letto i commenti, sembra che tu stia cercando più di una soluzione completa. Se capisco cosa vuoi, penso che la soluzione ideale sarebbe usare i certificati X.509. Potresti creare la tua CA (Certificate Authority) o acquistare un certificato da una terza parte attendibile online (mi piace RapidSSL ). Puoi quindi fare in modo che le tue app verifichino le comunicazioni dal server e utilizzare ECDH (Eliptic Curve Diffie-Hellman) per negoziare una chiave condivisa e facilitare comunicazioni sicure (hai detto che volevi un ingombro ridotto, quindi immagino che l'ECDH sarà più veloce del normale DH) . AES256 per la crittografia e SHA2 per la verifica del digest dei messaggi dovrebbe fornire una connessione sicura, ben supportata e ragionevolmente bassa. In pratica, utilizza TLS e assicurati di scegliere buone opzioni per il tipo di crittografia, il meccanismo di scambio delle chiavi e la funzione di digest dei messaggi.

    
risposta data 12.06.2012 - 22:09
fonte

Leggi altre domande sui tag