使用 openssl 生成 JWT RS256 签名

fst*_*nis 6 signature rsa openssl

我正在尝试使用openssl. 以以下示例令牌为例:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Run Code Online (Sandbox Code Playgroud)

根据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 -- '+/=' '-_ '
Run Code Online (Sandbox Code Playgroud)

但是,尝试使用 jwt.io 验证会导致无效签名。此外,使用 jwt.io 使用相同的私钥生成签名会产生完全不同的签名。

我究竟做错了什么?是否openssl dgst签署此令牌的正确方法是什么?

fst*_*nis 0

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 -- '+/=' '-_ '
Run Code Online (Sandbox Code Playgroud)