Estoy intentando firmar un token JWT con el algoritmo RS256 usando openssl
. Tome el siguiente token de ejemplo:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
PorRFC 7518, RS256 significa que la firma utilizada es "RSASSA-PKCS1-v1_5 usando SHA-256". Tengo entendido que el siguiente uso de openssl dgst
sería suficiente:
# generate the key
openssl genrsa -out private.pem 2048
# generate the signature
echo 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' | \
openssl dgst -sha256 -sign private.pem -binary | \
openssl base64 | \
tr -- '+/=' '-_ '
Sin embargo, intentar utilizar jwt.io para verificar da como resultado una firma no válida. Además, usar jwt.io para generar una firma usando la misma clave privada produce una completamente diferente.
¿Qué estoy haciendo mal? ¿Es openssl dgst
la forma correcta de firmar este token?
Respuesta1
echo
hace eco de sus argumentos como una línea, lo que significa que agrega un carácter de nueva línea. En algunos sistemas o shells -n
se suprime esto, peroprintf '%s' 'string'
es confiablemente correcto.
# generate the key
openssl genrsa -out private.pem 2048
# generate the signature
printf '%s' 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' | \
openssl dgst -sha256 -sign private.pem -binary | \
openssl base64 | \
tr -- '+/=' '-_ '