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