Revoca un certificato senza index.txt

6

Genero certificati client autofirmati per un piccolo server Apache ospitato sotto le mie scale. Lo script sotto è stato hackerato insieme per questo scopo - nota che usa il metodo 'mini-CA' x509 , quindi non registra nulla in un index.txt .

Ora ho bisogno di revocare uno di questi certificati client, che comporta la generazione di un CRL e l'aggiunta ad Apache. Generazione CRL sembra richiedere un index.txt tuttavia:

root@myserver:~# openssl ca -cert "ssl_ca/ca.crt" -keyfile "ssl_ca/ca.key" -revoke "ssl_badguy/badguy.p12"
./demoCA/index.txt: No such file or directory
unable to open './demoCA/index.txt'

Esiste un comando di generazione CRL "autonomo", come per la creazione di certificati? Non mi interessa la persistenza delle CA o il rispetto della "teoria" SSL valida (altrimenti non ci sarebbe auto-firma per un inizio). Inizialmente volevo solo proteggere e controllare l'accesso al mio server; ora voglio solo revocare parte dell'accesso.

Quando viene chiamato come ./ clientcert.sh certname , lo script seguente crea una nuova directory / root / ssl_certname / con tutto il bumf (incluso PKCS12).

#! /bin/bash

echo 'When it asks for a key password (3 times), recommend you use the new key name'
echo 'When it asks for cert details, use "." (blank) for all, EXCEPT CN, which should'
echo 'also be the key name. All other passwords ("Export" etc.) are blank'

clientname="$1"
newdir="/root/ssl_$1"
caloc="/root/ssl_ca"
cert="$newdir/$1"

if [ -d "$newdir" ]; then
    echo "$newdir already exists!"
else
    mkdir "$newdir"
    cd "$caloc"

    openssl genrsa -des3 -out "$cert.key" 2048
    openssl rsa -in "$cert.key" -out "$cert.key.insecure"
    mv "$cert.key" "$cert.key.secure"
    mv "$cert.key.insecure" "$cert.key"

    openssl req -new -key "$cert.key" -out "$cert.csr"

    openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in "$cert.csr" -out "$cert.crt"

    openssl pkcs12 -export -clcerts -in "$cert.crt" -inkey "$cert.key" -out "$cert.p12"
fi

EDIT: Tecnicamente non risolve il problema, ma ho raggiunto la stessa cosa aggiungendo quanto segue al mio default-ssl vhost:

# Block badguy client cert
Rewritecond %{SSL:SSL_CLIENT_S_DN_CN} =badguy
RewriteRule (.*) /blocked [QSA,R,L]

- dove / blocked in realtà non esiste (credo che potrei mettere una pagina di attesa lì).

    
posta benxyzzy 09.10.2013 - 15:03
fonte

3 risposte

6

Innanzitutto, siamo chiari: i certificati client sono non autofirmati. Sono firmati da una CA e il certificato di CA è autofirmato. Questo è importante, perché un certificato autofirmato non può essere revocato affatto, per definizione: la revoca è un'informazione proveniente dalla CA emittente; un certificato autofirmato è la sua CA.

Un secondo punto importante è che un CRL è un elenco di certificati revocati finora . Quindi se revochi un certificato, allora hai un CRL che designa quel certificato; se si revoca un altro, allora il prossimo CRL deve designare entrambi i certificati . Se il prossimo CRL parla solo del secondo certificato, allora "annulla" il primo. Per la revoca, Apache non ha memoria, o meglio, il CRL è la memoria di Apache. Apache utilizzerà l'ultimo CRL come fonte esclusiva di informazioni di revoca per tutti i certificati.

Ciò significa che è davvero necessario mantenere un elenco di certificati revocati sulla CA. Lo strumento da riga di comando openssl può mantenere questo elenco per te: questo è il file index.txt , come mantenuto dall'opzione della riga di comando openssl ca . Se non lo usi, dovrai mantenere le informazioni da solo, il che è, nel migliore dei casi, ingombrante. Se vuoi gestire la revoca, il modo più semplice è utilizzare index.txt e lasciare che sia OpenSSL a gestirlo.

Ora, se l'hai già fatto, allora è ovviamente possibile firmare un CRL con la chiave privata CA usando la libreria , a livello di programmazione; ma non esiste uno strumento da riga di comando per questo. Lo si dice nella documentazione :

BUGS

Ideally it should be possible to create a CRL using appropriate options and files too.

E anche :

RESTRICTIONS

The text database index file is a critical part of the process and if corrupted it can be difficult to fix. It is theoretically possible to rebuild the index file from all the issued certificates and a current CRL: however there is no option to do this.

Per produrre un CRL con un certo codice, suggerisco di dare un'occhiata al codice sorgente di OpenSSL, nel file apps/ca.c ; cerca " X509_CRL_new ". Le funzioni non sono ben documentate ... Ma, insisto, se inizi a revocare i certificati, devi mantenere un elenco di tutti i certificati revocati finora (almeno i numeri seriali, preferibilmente con la data di revoca per ciascuno di essi), e questo in pratica significa creare il tuo equivalente del file index.txt di openssl ca .

    
risposta data 09.10.2013 - 16:01
fonte
4

Ora trovo che devo aggiungere un'altra risposta, ad un altro livello.

Stai tentando di utilizzare i certificati per autorizzazione . Non farlo. Non funziona bene a lungo termine.

I certificati sono per l'autenticazione . Un certificato ti dice: questo ragazzo possiede quella chiave pubblica. La revoca è un modo per annullarla e deve essere utilizzata quando la proprietà della chiave non viene più mantenuta: ad es. la chiave privata è stata rubata, quindi il tizio non "possiede più" la chiave pubblica. Nel tuo caso, la proprietà chiave è ancora valida: sebbene il ragazzo sia dichiarato sgradito, possiede ancora la chiave pubblica dal suo certificato. In questo senso, la revoca non è lo strumento adatto.

In termini tecnici, tutto si riduce al fatto che la distribuzione dei certificati è costosa e la revoca dei certificati è asincrona. Il modo "giusto" per fare le cose è usare i certificati per autenticazione (il client dimostra la sua identità), ma per gestire autorizzazione altrove: l'autorizzazione è il processo mediante il quale si determina quali azioni sono consentite per una determinata identità. Cercare di spingere i bit di autorizzazione nel certificato è un percorso che conduce al dolore (un errore classico che tutti coloro che sono coinvolti in PKI lo fanno a un certo punto, ma è comunque un errore).

Il modulo mod_authz_user potrebbe aiutarti a mantenere le informazioni di autorizzazione (ad es. l'elenco di permessi o negati utenti) in file utili (non l'ho provato).

    
risposta data 09.10.2013 - 16:22
fonte
1

Il file index.txt viene utilizzato per tenere traccia dei certificati generati e di alcune proprietà, come la data di revoca. Questo file viene utilizzato per generare il CRL.

-gencrl

    this option generates a CRL based on information in the index file.

Puoi modificare il file predefinito nel file openssl.conf se necessario, o usare il tuo come in: link , o come la prossima risposta suggerisce, prova a fare il lavoro manualmente usando i comandi x 509: link .

Quest'ultimo utilizza -Actions per aggirare le opzioni predefinite di openss.conf . Si prega di avvisare che il file index.txt è una parte importante dell'impostazione CA openssl e non dovrebbe essere eliminato in un ambiente di produzione.

    
risposta data 09.10.2013 - 16:06
fonte

Leggi altre domande sui tag