2017-10-10 21 views
0

私は、Boxアカウントからファイルを取得するためのシェルスクリプトを設定しようとしています。これを行うには、認証トークンが必要です。 authトークンは、スクリプトを使用して自動的に生成する必要があるため、手動の手順は必要ありません。これは、JWT請求を作成して提出することによって行うことができます。bash/shellスクリプトを使用してRS256 JWTアサーションを作成するにはどうすればよいですか?

ボックスのドキュメントでは、「RS256」、「RS384」、および「RS512」のみを受け入れることを指定しています。私はどのように上の任意の兆候を見つけることができるかどうかを確認するためにウェブサイトを検索する時間を費やしてきた

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

:私は、私はボックスのマニュアルと、このウェブサイトを使用してアサーションを作成するため除いて必要な設定すべてにできていますbash/shellスクリプトを使ってアサーションを生成することはできません。私がリンクしたウェブサイトは私が見つけた最も近いものですが、HS256を使用していますが、これはBoxでサポートされていません。

私のスクリプトは、私が以前にリンクしたウェブサイトの最初のスクリプトと実際には同じです(手動で生成された認証トークンで実際にファイルを取得するために使用した別のスクリプトがあります)。アサーションを生成するために必要なコマンドを手伝ってください。

+0

*ピュア* bashの?どのような理由でも、['python-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

関連する問題