我正在尝试使用 RS256 算法对 JWT 令牌进行签名openssl
。以下是示例令牌:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
每RFC 7518,RS256 表示使用的签名是“使用 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
将其参数回显为一行——这意味着它会添加一个换行符。在某些系统或 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 -- '+/=' '-_ '