我正在嘗試使用 RS256 演算法簽署 JWT 令牌openssl
。採取以下範例令牌:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
每RFC 7518, RS256 表示使用的簽章是「RSASSA-PKCS1-v1_5 using SHA-256」。我的理解是,以下使用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
將其參數作為一行進行回顯——這意味著它添加了一個換行符。在某些系統或 shell 上-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 -- '+/=' '-_ '