Generando firma JWT RS256 con openssl

Generando firma JWT RS256 con openssl

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 dgstserí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 dgstla forma correcta de firmar este token?

Respuesta1

echohace 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 -nse 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 -- '+/=' '-_ '

información relacionada