使用 openssl 產生 JWT RS256 簽名

使用 openssl 產生 JWT RS256 簽名

我正在嘗試使用 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 -- '+/=' '-_ '

相關內容