生成JWT签名调用API遇Invalid SCA错误,求私钥格式及解决方案
问题分析与解决方案
1. 私钥的正确格式要求
RS256算法签名JWT时,必须使用PEM编码的RSA私钥,常见两种合规格式:
- PKCS#1格式:
-----BEGIN RSA PRIVATE KEY----- [base64编码的私钥内容,每行64字符左右] -----END RSA PRIVATE KEY----- - PKCS#8格式(更通用):
-----BEGIN PRIVATE KEY----- [base64编码的私钥内容,每行64字符左右] -----END PRIVATE KEY-----
如果你的txt文件只有裸base64密钥内容(无首尾标记),需要手动添加标记并格式化每行长度为64字符(可用fold -w 64命令)。
2. 现有命令的核心错误
- 时间戳逻辑错误:
iat(签发时间)1706896701晚于exp(过期时间)1706896597,导致JWT本身无效,API直接判定非法。 - URL-safe Base64处理不彻底:原命令中
s/\+/-/只替换第一个+,未全局替换,应该用tr一次性完成所有字符替换。
3. 修正后的完整JWT生成命令
# 生成JWT Header,处理为URL-safe Base64 token_header=$(echo -n '{"alg":"RS256","typ":"JWT"}' | base64 | tr -d '\n=' | tr '+' '-' | tr '/' '_') # 生成JWT Payload,确保iat < exp(用当前时间作为iat,当前时间+3600秒作为exp) current_time=$(date +%s) exp_time=$((current_time + 3600)) token_body=$(echo -n "{\"exp\": $exp_time,\"iat\": $current_time,\"iss\":\"123456-us-xxx\",\"jti\":\"123456_xxx_123\",\"SystemInitiated\":true}" | base64 | tr -d '\n=' | tr '+' '-' | tr '/' '_') # 生成签名,处理为URL-safe Base64 token_signature=$(echo -n "$token_header.$token_body" | openssl dgst -sha256 -binary -sign PrivateKey.key | base64 | tr -d '\n=' | tr '+' '-' | tr '/' '_') # 拼接完整JWT complete_jwt_token="$token_header.$token_body.$token_signature" echo "$complete_jwt_token"
4. 私钥格式转换(若当前为裸txt密钥)
如果你的PrivateKey.txt是无首尾标记的裸base64内容,执行以下命令转换成PKCS#1格式的PEM私钥:
echo "-----BEGIN RSA PRIVATE KEY-----" > PrivateKey.key fold -w 64 PrivateKey.txt >> PrivateKey.key echo "-----END RSA PRIVATE KEY-----" >> PrivateKey.key
若为PKCS#8格式,将首尾标记替换为-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----即可。
5. 验证与curl请求
- 验证JWT有效性:可使用openssl用对应公钥验证签名(确保签名正确):
echo -n "$token_header.$token_body" > jwt_data.tmp echo -n "$token_signature" | tr '-' '+' | tr '_' '/' | base64 -d > jwt_sig.tmp openssl dgst -sha256 -verify PublicKey.pem -signature jwt_sig.tmp jwt_data.tmp - 正确的curl请求示例:
curl -H "Authorization: Bearer $complete_jwt_token" https://your-api-endpoint.com
内容的提问来源于stack exchange,提问作者Mohammed Inayathullah
相关产品推荐
相关产品推荐

