2011-12-23 17 views
7

Sto lavorando a un progetto per animali domestici che (alla fine, quando è pronto) consentirà trasferimenti di file sicuri (c'è di più oltre a questo, ma il resto non è particolarmente rilevante). Mi piacerebbe utilizzare la libreria OpenSSL, poiché sembra essere la libreria di crittografia gratuita più completa (e ho bisogno di supporto per la crittografia simmetrica di base e l'hashing, oltre a SSL/TLS).SSL/TLS senza certificati

Sto cercando di implementare uno schema di sicurezza simile a in SSH. Fondamentalmente, un utente si collegava al mio computer con TLSv1 (SSLv3.1). Mi piacerebbe che la connessione avesse successo indipendentemente dalla sicurezza. Quindi, voglio essere in grado di ispezionare il pubblico chiave (non un intero certificato) che l'utente ha utilizzato. Tale chiave sarebbe confrontata con le chiavi pubbliche conosciute e, se corrispondesse, l'utente sarebbe autorizzato ad accedere a un determinato insieme di comandi. Se non corrispondesse, l'utente avrebbe la possibilità di utilizzare la connessione per richiedere l'aggiunta della sua chiave pubblica alla mia raccolta, ma a parte questo non sarebbe in grado di accedere ai miei servizi.

Non ho alcun bisogno particolare di certificati qui. Sarebbe molto più semplice per me se potessi saltare tutti i dettagli del certificato e lavorare solo con le chiavi di crittografia non elaborate. Questo perché questo modello segue un modello di web-of-trust, non il modello gerarchico utilizzato dalla maggior parte delle connessioni SSL/TLS, quindi non ho bisogno di certificati CA o firmati.

Sfortunatamente, la documentazione della maggior parte di OpenSSL è, beh, inesistente. Tutti gli articoli pertinenti che trovo sembrano occupati con l'impostazione di una connessione SSL/TLS "standard", in cui il certificato del server viene verificato fino a un insieme di certificati radice. Questo può essere utile, ma è difficile per me capire come far funzionare queste connessioni SSL non tradizionali.

Qualcuno può suggerire qualche articolo o documentazione che potrebbe aiutarmi a capire come realizzare questo?

(L'uso di OpenSSL non è impostato su pietra e potrei passare a un'altra libreria se fornisce un modo migliore per farlo, oltre a hashing [SHA-512] e crittografia simmetrica [AES]. m mirando a indirizzare Linux, ma sarebbe bello se il prodotto finale fosse trasferibile a Windows, così anche i miei amici potrebbero usarlo.)

+1

Confrontare una chiave pubblica con un elenco di chiavi pubbliche consiste essenzialmente nell'utilizzare una password, che sconfigge l'intera PKI-ness di https e ssl. Il suggerimento di creare e utilizzare certificati autofirmati è buono se si controllano sia il software client che quello server (in modo che sia possibile configurare la relazione di fiducia). –

+1

@AdamLiss, no, non è uguale alla password: l'utente non deve mai inviare la chiave privata, mentre l'utente dovrebbe inviare la password. (E confrontare i certificati autofirmati in una lista equivale a paragonare le loro chiavi pubbliche.) – Bruno

+0

Tuttavia, non sto utilizzando la PKI. L'idea è che se sei il mio "amico" (ho la tua chiave pubblica/cert), puoi scaricare i file (che specifichi) dal mio computer PLUS che posso scaricare da MY friends. Il problema è che non puoi vedere da dove provengono i file (cioè, se A e B sono amici e B e C sono amici, A può scaricare da C a B, ma non sa nulla di C) . Almeno, questa è l'idea in poche parole. [OneSwarm] (http://www.oneswarm.org/) mi ha dato l'ispirazione per questo progetto. – Ethan

risposta

3

Per espandere sulla risposta di Eugene (avrei messo questo come un commento, ma è un po 'lungo) ...

Dopo aver fatto questo genere di cose con l'FOAF+SSL project (in seguito ribattezzata WebID), attaccare con X I certificati .509 semplificano l'implementazione, semplicemente perché la maggior parte degli stack SSL/TLS sono progettati pensando a loro (e la loro API riflette questo).

L'ultima volta che ho controllato FOAF + SSL, i controlli PKI tradizionali erano ancora attivi affinché il client verificasse il certificato del server. Un'altra opzione, simile a SSH, sarebbe accettare la chiave pubblica/certificato la prima volta che lo si incontra e avvisare l'utente quando cambia. Questo è più o meno il modo in cui funziona SSH (in particolare, credo che poche persone effettivamente controllino l'impronta digitale della chiave dalle bande la prima volta che la vedono).

Considerando solo l'utilizzo del client certificato (anche se alcune di queste potrebbe applicarsi a certs del server in modo analogo):

  • La maggior parte delle librerie del server sembrano essere in grado di elaborare certificati X.509, ma si lascia cambiare il modo in cui sono verificati (esX509TrustManager in Java).
  • Anche se non si è in grado di fidarsi di nulla che il client-dice dice fino a quando non lo si è verificato diversamente, essere in grado di incorporare alcune informazioni aggiuntive (come DN soggetto o Nome alternativo soggetto per vedere chi l'utente dichiara di essere) può aiutare (a) gli utenti a organizzare i loro certificati e (b) dare un suggerimento al verificatore di sapere cosa cercare. Una chiave pubblica nuda può essere difficile da gestire.
  • Un numero di strumenti client esistenti (in particolare i browser) utilizzano i certificati X.509 quando si esegue l'autenticazione client SSL/TLS. Non c'è molto da fare per configurare un client per utilizzare un certificato X.509 autofirmato (al contrario di un certificato da una PKI). (Esistono pochissimi strumenti che supportano OpenPGP per TLS, non sono sicuro che siano in grado di utilizzarlo come una forma di certificato client.)
  • Poiché non si può fidarsi della cert senza verifiche esterne, non importa se è autofirmato o meno (cioè se l'emittente e il soggetto sono uguali), almeno assumendo che l'utente non ti invierebbe un certificato con il quale non sarebbe d'accordo (quindi non avrebbe essere sigillato con la propria chiave). Una conseguenza di ciò è che è possibile creare un servizio per rilasciare certs abbastanza facilmente. La generazione di chiavi nel browser, ad esempio, è utile per gli utenti che non desiderano utilizzare i comandi openssl o keytool. Here è un servizio di esempio che emetterà un certificato con la SAN che l'utente desidera (potrebbero esserci versioni più recenti se si verifica con il progetto FOAF + SSL/WebID). Qualunque sia la chiave privata o il nome dell'emittente, tale servizio utilizza a malapena le questioni, ma poiché i browser sono progettati attorno agli PKI tradizionali, non rende facile l'utilizzo di certificati autofirmati.

Ci sono anche problemi quando si tratta di chiedere uno specifico certificato cliente. La specifica TLS 1.1 consente esplicitamente lo certification authorities vuoto (vedere RFC 4346), mentre il TLS 1.0 era silenzioso sull'argomento. In pratica, anche con TLS 1.0, la maggior parte degli strumenti client sembra essere felice con una lista vuota (offriranno solo più scelta). Se desideri che i tuoi certificati per il tuo sistema siano facilmente identificabili, puoi utilizzare lo stesso DN emittente per tutti questi certificati, anche se non sono firmati con la stessa chiave privata in pratica (anche in questo caso, poiché ignorerai la firma).

+0

L'idea è che vorrei generare un codice di invito e dare quel codice ad un amico. Insieme al codice, inserirò alcuni dettagli sul mio nuovo amico (in particolare, un indirizzo nel quale si trovano, come ethan.no-ip.org). Quando inviano una "domanda", usano il codice di invito e possono anche inviare un messaggio.Il programma controllerebbe per assicurarsi che l'invito fosse corretto e che l'indirizzo che ho inserito risolva l'origine dell'applicazione al momento della sua creazione. Posso anche farlo in modo da ispezionare manualmente il messaggio. L'idea è che questo è il modo in cui convalidare nuovi "amici". – Ethan

2

Utilizzare certificati autofirmati - questo è lo stesso dei tasti "grezzi" ma è più facile gestire (vedere this question su come accettare o non accettare un certificato autofirmato in openssl).

+0

Quindi la risposta sarebbe "Non esiste un modo semplice per non utilizzare i certificati, è più semplice usare solo certificati autofirmati". Immagino che funzioni. Posso ancora saltare il caricamento di tutti i certificati di root, giusto? Immagino che l'ovvio seguito sia: Posso forzare OpenSSL a ** solo ** accettare certificati autofirmati? – Ethan

+0

@ End, non ha senso limitare l'accesso solo ai certificati autofirmati (e rifiutando gli altri). Se sei disposto ad accettare qualsiasi certificato autofirmato, puoi anche accettare qualsiasi cosa, dato che non sarai in grado di controllare che il DN dell'emittente sia quello che dicono di essere (usando solo la cert), se o non DN dell'emittente = il DN soggetto diventa irrilevante. – Bruno

+0

@Ethan in generale SSL supporta l'autenticazione con chiavi OpenPGP o con chiave segreta pre-condivisa. Ma nessuno di questi si adatterà. Per quanto riguarda l'accettazione solo autofirmata, è possibile controllare dinamicamente cosa fidarsi e suppongo che tra gli altri controlli OpenSSL dovrebbe consentire di verificare se il certificato è autofirmato (i suoi campi Emittente e Oggetto devono essere identici). –