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ì).