Genero certificados de cliente autofirmados para un pequeño servidor Apache alojado debajo de mis escaleras. El script a continuación fue pirateado juntos para este propósito: tenga en cuenta que utiliza el método "mini-CA 'x509 ' mini-CA 'x509 , por lo tanto, no se registra nada en un index.txt .
Ahora necesito revocar uno de estos certificados de cliente, lo que implica generar una CRL y agregarla a Apache. Sin embargo, la generación de CRL parece requerir un index.txt:
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'
¿Existe un comando de generación de CRL 'independiente', según la creación de cert? No me importa la persistencia de las CA o el respeto de la "teoría" de SSL adecuada (de lo contrario, no habría autofirmación para empezar). Originalmente, solo quería asegurar y controlar el acceso a mi servidor; ahora solo quiero revocar parte de ese acceso.
Cuando se llama según ./clientcert.sh certname , el siguiente script crea un nuevo directorio / root / ssl_certname / con todo el bumf (incluido 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: técnicamente no resuelve el problema, pero he logrado lo mismo al agregar lo siguiente a mi default-ssl vhost:
# Block badguy client cert
Rewritecond %{SSL:SSL_CLIENT_S_DN_CN} =badguy
RewriteRule (.*) /blocked [QSA,R,L]
: donde / blocks no existe realmente (supongo que podría colocar una página de espera allí).