2017-10-10 100 views
0

我试图设置一个shell脚本来从一个Box帐户中获取一个文件。为此,需要身份验证令牌。身份验证令牌必须通过脚本自动生成,因此不需要手动步骤。这可以通过构建和提交智威汤逊索赔来完成。如何使用bash/shell脚本创建RS256 JWT断言?

Box的文件规定,他们只接受“RS256“,“RS384”和“RS512“。我已经能够建立我需要的一切,除了使用Box的文档创建断言和这个网站:

http://willhaley.com/blog/generate-jwt-with-bash/

我已经花了几个小时通过网站搜索,看看我能找到如何任何指示使用bash/shell脚本生成断言无济于事。我链接的网站是我发现的最接近的网站,但它使用HS256,Box不支持。

我的剧本是目前几乎相同的网站我刚才联系上的第一个脚本(我有我用于实际测试抓住了手动生成验证令牌的文件一个单独的脚本)。请帮助生成断言所需的命令。

+0

*纯*庆典?任何理由不给,说,打电话到使用['蟒蛇-jwt'(https://github.com/davedoesdev/python-jwt)库Python解释? –

+0

(不,它不能做 - OpenSSL的*不*暴露通过命令行RSA运算,这使得编写这样做靠谱的答案就是需要对其进行测试)。 –

+0

@CharlesDuffy是的,纯粹的bash。我有权配置一个Jenkins作业。我无法访问服务器或配置Jenkins。所有可用的是“Execute Shell”。 – JKL

回答

2

考虑下面的,它支持HS256和RS256:

#!/usr/bin/env bash 

# Inspired by implementation by Will Haley at: 
# http://willhaley.com/blog/generate-jwt-with-bash/ 

set -o pipefail 

# Shared content to use as template 
header_template='{ 
    "typ": "JWT", 
    "kid": "0001", 
    "iss": "https://stackoverflow.com/questions/46657001/how-do-you-create-an-rs256-jwt-assertion-with-bash-shell-scripting" 
}' 

build_header() { 
     jq -c \ 
       --arg iat_str "$(date +%s)" \ 
       --arg alg "${1:-HS256}" \ 
     ' 
     ($iat_str | tonumber) as $iat 
     | .alg = $alg 
     | .iat = $iat 
     | .exp = ($iat + 1) 
     ' <<<"$header_template" | tr -d '\n' 
} 

b64enc() { openssl enc -base64 -A | tr '+/' '-_' | tr -d '='; } 
json() { jq -c . | LC_CTYPE=C tr -d '\n'; } 
hs_sign() { openssl dgst -binary -sha"${1}" -hmac "$2"; } 
rs_sign() { openssl dgst -binary -sha"${1}" -sign <(printf '%s\n' "$2"); } 

sign() { 
     local algo payload header sig secret=$3 
     algo=${1:-RS256}; algo=${algo^^} 
     header=$(build_header "$algo") || return 
     payload=${2:-$test_payload} 
     signed_content="$(json <<<"$header" | b64enc).$(json <<<"$payload" | b64enc)" 
     case $algo in 
       HS*) sig=$(printf %s "$signed_content" | hs_sign "${algo#HS}" "$secret" | b64enc) ;; 
       RS*) sig=$(printf %s "$signed_content" | rs_sign "${algo#RS}" "$secret" | b64enc) ;; 
       *) echo "Unknown algorithm" >&2; return 1 ;; 
     esac 
     printf '%s.%s\n' "${signed_content}" "${sig}" 
} 

(($#)) && sign "[email protected]" 

...用法:

rsa_secret=' 
-----BEGIN RSA PRIVATE KEY----- 
MIIEpAIBAAKCAQEAtHEDjwkBpsjhit+wXZMMj2AaRHyWSKatjzLtVEGdyXrbQGgQ 
PjbfqPtqKsBPjcifHh8VAgrEtETbLN8pbE/XLRaB9P76hib6DATBn2JC6XG/NkAu 
0b2F8WB6ZuJh3fbubSOZaORRIyRvfidV5Wjb7NbEDhuSxFLaq0ad2+rQHyBgMfQS 
43OqhEa463WQt5F9NuWRTqweh5UotT6Mg9YgkvmBdA4IbJMEDWGFNecUzAGuESYq 
wzJaaQ4S58ce7HxFDywM0nFXlNx1pxZwZOZfG7bddUD8FuwbBMx5c3Z3U8LAA+J/ 
50A/kxuZoa6sRTb7gXfBxy2riechlOTL+5ut3wIDAQABAoIBAD8bm5wGEV7MuR1B 
+MPxbx4iBW3YiRMlwGPp8tlaDZ5u6onPG4c21+iY7du/4NL8zLHTOxy4uW02+9To 
w+sOzXoGejM+jk4nCaL0cueUjURqNO77aaSPfW4bSRP8ry/bci4Xmkr2N25sCtZ7 
WW5fyzM9NdqdSCqDs9jdXM6ShHGt4aG1w4Q38pfl2O2KUqgGYA8j8S7oEpcuApIj 
sNH8o2PIFaFuRoUBq6WxSZBY7YdvKM0xlE0NKiDMAUIeTIRqtm8GPo7ot8dV6VHU 
EglN7gaEve75XW0DAkK2lDDpGPlVHJwLgKGiSuW0qMh6lY+dKjsZ8wyz85DqTnyo 
+42ZI6kCgYEA36X4c4a/tlh0A6i+EaA1CqmN8jh3nNMYgZvovTnIezCvO+RuJJEG 
KQQjr8/z+E8FYobImrrZsuSL+UFs1trl/nSndWh22B7fQQbJBdHwhv39YWReS0tW 
7t3LJJG3oQnR/ChlqyTToHfS0WcdtYQ0cnFWSx73Hg/S+cu0vHtcUrUCgYEAzosH 
dXq1VGRgf3TIoI9s4xJt/SnH+VHtP4dvLKzY7NN4K76DIYdQIn1xQ1Y3705v/XG+ 
xTNAaoOaH6hBnRxwxcv6GmCpICJ2C21puxA63RqCslab5fc23wvMv/wwoEWPtXhf 
3OOKZxszLR1vFqZaYTWzVmTxg+r5b2aNBB0MtsMCgYBAv+6Ek/ihNE6yWIJe3AE/ 
SwOboxmOP9eSfq8NSdNvRxMUxffVgl9ENLyYRB6gP1CRy+/8TCiHEIAt8/Es60c3 
OlLZPRtbSuTcELjWhIecraBUOBjMt809bt1HgyCk8RDoblGxEQJsLQTON4p0aQg+ 
Me4H5bkp7O7p/z4ea6C5GQKBgQCewy+QliocHKwwTMyK3rSMNvZky2DzvI3pb2l9 
pb95C3Qr691QQHrQiCwv3m5QfLKI1o4VdzfkqBQokWUeJ2ZoJEqzS+m00ch7MDc9 
m1Qj8OTVwM1FD6oV+TQBvxCBofa9PzIw0JbqenX0D9P8TRLb9jNMDXu4Mz5Y6zMq 
HkpPkQKBgQCgrcW7U0Q+081N25VfghCPRd/o+dtqP3udXgj0nIX6y3qeCJiPeamZ 
plMNqdZScaK37wMouAIPD0u5w1OCnlepuUxU3h5y55Lzx3PnDlU1H+yfBsTi1KL/ 
sDjgs31j//w80krxJNj5/i2AeYzATmybPwyM/c/PVBv/hecreUbTlQ== 
-----END RSA PRIVATE KEY----- 
' 

test_payload='{ 
    "Id": 1, 
    "Name": "Hello, world!" 
}' 
sign rs256 "$test_payload" "$rsa_secret" 
+0

这样做!非常感谢! – JKL