Gerando assinatura JWT RS256 com openssl

Gerando assinatura JWT RS256 com openssl

Estou tentando assinar um token JWT com o algoritmo RS256 usando openssl. Veja o seguinte token de exemplo:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

PorRFC 7518, RS256 significa que a assinatura usada é "RSASSA-PKCS1-v1_5 usando SHA-256". Meu entendimento é que o seguinte uso de openssl dgstfaria:

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

No entanto, tentar usar o jwt.io para verificar resulta em assinatura inválida. Além disso, usar o jwt.io para gerar uma assinatura usando a mesma chave privada produz uma assinatura completamente diferente.

O que estou fazendo de errado? É openssl dgsta maneira correta de assinar esse token?

Responder1

echoecoa seu(s) argumento(s) como uma linha - o que significa que adiciona um caractere de nova linha. Em alguns sistemas ou shells -nsuprime isso, masprintf '%s' 'string'está confiávelmente correto.

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

informação relacionada