Varnish: cómo verificar la firma de JWT utilizando el módulo incrementable de digestión.
Tengo un DockerFile basado en Varnish 7.0 alpine, tengo un archivo vcl personalizado para manejar la autenticación de JWT. Pasamos el JWT como un Bearer en el encabezado.
Estoy basado en este ejemplo: https://feryn.eu/blog/validating-json-web-tokens-in-varnish/
set req.http.tmpPayload = regsub(req.http.x-token,"[^\.]+\.(.+)\.[^\.]+$","\1");
set req.http.tmpHeader = regsub(req.http.x-token,"(.+)\.[^\.]+\.[^\.]+","\1");
set req.http.tmpRequestSig = regsub(req.http.x-token,"^[^\.]+\.[^\.]+\.([^\.\n\r]+)$","\1");
set req.http.tmpCorrectSig = digest.base64url_nopad_hex(digest.hmac_sha256(std.fileread("/jwt/privateKey.pem"), req.http.tmpHeader + "." + req.http.tmpPayload));
std.log("req sign " + req.http.tmpRequestSig);
std.log("calc sign " + req.http.tmpCorrectSig);
if(req.http.tmpRequestSig != req.http.tmpCorrectSig) {
std.log("invalid signature match");
return(synth(403, "Invalid JWT signature"));
}
Mi problema es que tmpCorrectSig
está vacío, no sé si puedo cargarlo desde un archivo, ya que mi archivo contiene saltos de línea y otros caracteres.
Para información, este Vmod está haciendo lo que quiero: https://code.uplex.de/uplex-varnish/libvmod-crypto, pero no puedo instalarlo en mi arquitectura Arm M1 pro, he pasado mucho tiempo intentándolo…
¿Puedo lograr lo que quiero?
davy.ai
Parece que puede haber un problema con la variable
tmpCorrectSig
que no se está poblado correctamente en tu archivo VCL personalizado para la autenticación JWT en Varnish 7.0 alpine. Una posible solución podría ser verificar si la funciónstd.fileread
es capaz de leer correctamente el contenido de tu archivo de clave privada o si hay algún problema con el formato del archivo.Si no puedes utilizar la Vmod
libvmod-crypto
debido a limitaciones de hardware, podrías considerar el uso de una biblioteca criptográfica alternativa que sea compatible con tu arquitectura Arm M1 pro. Otra posible solución podría ser intentar utilizar un método diferente para generar la firma JWT dentro de tu archivo VCL, como utilizando la funcióndigest.base64url_nopad_hex
con un algoritmo hash diferente.En general, es posible lograr la funcionalidad de autenticación JWT deseada en Varnish 7.0 alpine con un archivo VCL personalizado, pero puede requerir solucionar problemas y experimentación para identificar la fuente del problema con la variable
tmpCorrectSig
y encontrar una biblioteca criptográfica o método adecuado para utilizar.