openssl で JWT RS256 署名を生成する

openssl で JWT RS256 署名を生成する

RS256 アルゴリズムを使用して JWT トークンに署名しようとしていますopenssl。次のトークンの例を見てみましょう。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

パーRFC 7518RS256 は、使用される署名が「SHA-256 を使用した RSASSA-PKCS1-v1_5」であることを意味します。 私の理解では、 を次のように使用すればopenssl dgstいいと思います。

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

ただし、jwt.io を使用して検証しようとすると、無効な署名が生成されます。さらに、jwt.io を使用して同じ秘密鍵で署名を生成すると、まったく異なる署名が生成されます。

何が間違っているのでしょうか?openssl dgstこのトークンに署名する正しい方法ですか?

答え1

echo引数を行としてエコーします。つまり、改行文字を追加します。一部のシステムやシェルでは-nこれを抑制しますが、printf '%s' 'string'確実に正しい

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

関連情報