Revocar un certificado sin index.txt

6

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

    
pregunta benxyzzy 09.10.2013 - 15:03
fuente

3 respuestas

6

En primer lugar, seamos claros: los certificados del cliente son no autofirmados. Están firmados por una CA y el certificado de CA está autofirmado. Esto es importante, ya que un certificado autofirmado no se puede revocar en absoluto, por definición: la revocación es una información que proviene de la CA emisora; un certificado autofirmado es su propia CA.

Un segundo punto importante es que una CRL es una lista de certificados revocados hasta ahora . Entonces, si revoca un certificado, entonces tiene una CRL que designa ese certificado; Si luego revoca otro, su próxima CRL debe designar los certificados ambos . Si la siguiente CRL solo habla del segundo certificado, entonces "anula" el primero. Para la revocación, Apache no tiene memoria, o más bien, la CRL es la memoria de Apache. Apache utilizará la última CRL como fuente exclusiva de información de revocación para todos los certificados.

Esto significa que realmente necesita mantener una lista de certificados revocados en la CA. La herramienta de línea de comando openssl puede mantener esa lista para usted: ese es el archivo index.txt , como lo mantiene la opción de línea de comando openssl ca . Si no lo usa, entonces tendrá que mantener la información usted mismo, lo que es, en el mejor de los casos, engorroso. Si desea controlar la revocación, la forma más sencilla es usar index.txt y dejar que OpenSSL lo administre.

Ahora, si ya lo ha hecho, es posible, por supuesto, firmar una CRL con la clave privada de la CA usando la biblioteca , programáticamente; pero no hay una herramienta de línea de comandos para eso. Esto se dice en la documentación :

  

BUGS

     

Idealmente, debería ser posible crear una CRL usando las opciones y los archivos apropiados también.

Y también allí :

  

RESTRICTIONS

     

El archivo de índice de la base de datos de texto es una parte crítica del proceso y si está dañado puede ser difícil de arreglar. En teoría, es posible reconstruir el archivo de índice de todos los certificados emitidos y una CRL actual: sin embargo, no hay opción para hacer esto.

Para producir una CRL con algún código, sugiero que mire el código fuente de OpenSSL, en el archivo apps/ca.c ; busca " X509_CRL_new ". Las funciones no están bien documentadas ... Pero, insisto, si comienza a revocar los certificados, debe mantener una lista de todos los certificados revocados hasta ahora (al menos los números de serie, preferiblemente con la fecha de revocación de cada uno de ellos). y esto básicamente significa crear tu propio equivalente del archivo index.txt de openssl ca .

    
respondido por el Tom Leek 09.10.2013 - 16:01
fuente
4

Ahora encuentro que debo agregar otra respuesta, en otro nivel.

Está intentando utilizar certificados para autorización . No lo hagas No funciona bien a largo plazo.

Los certificados son para autenticación . Un certificado le dice: este chico posee esa clave pública. La revocación es una forma de cancelar eso, y debe utilizarse cuando ya no se mantiene la propiedad de la clave: por ejemplo, La clave privada fue robada, por lo que el individuo ya no "posee" la clave pública. En su caso, la propiedad de la clave sigue siendo válida: aunque el sujeto sea declarado inoportuno, todavía posee la clave pública de su certificado. En ese sentido, la revocación no es la herramienta adecuada.

En términos técnicos, todo se reduce a los hechos de que la distribución de certificados es costosa y la revocación de certificados es asíncrona. La manera "correcta" de hacer las cosas es usar certificados para la autenticación (el cliente prueba su identidad), pero para manejar la autorización en otra parte: la autorización es el proceso mediante el cual usted determina Qué acciones se permiten para una identidad dada. Tratar de insertar bits de autorización en el certificado es una ruta que conduce al dolor (un error clásico que todos los involucrados en PKI cometen en algún momento, pero aún es un error).

El módulo mod_authz_user puede ayudarlo a mantener la información de autorización (por ejemplo, la lista de permitidos o rechazados usuarios) en archivos útiles (no lo he intentado).

    
respondido por el Tom Leek 09.10.2013 - 16:22
fuente
1

El archivo index.txt se usa para realizar un seguimiento de los certificados generados y algunas propiedades, como la fecha de revocación. Este archivo se utiliza para generar la CRL.

-gencrl

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

Puede cambiar el archivo predeterminado en el archivo openssl.conf si es necesario, o usar su propio like en: enlace , o como lo sugiere la siguiente respuesta, intente realizar el trabajo manualmente con los comandos x509: enlace .

Este último utiliza -CAoptions para eludir las opciones predeterminadas de openss.conf . Tenga en cuenta que el archivo index.txt es una parte importante de la configuración de CA de openssl y no debe descartarse en un entorno de producción.

    
respondido por el M'vy 09.10.2013 - 16:06
fuente

Lea otras preguntas en las etiquetas