|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +prepared_authority=$(docker compose exec -t -e SPIRE_SERVER_FFLAGS=forced_rotation spire-server \ |
| 4 | + /opt/spire/bin/spire-server \ |
| 5 | + localauthority jwt show -output json | jq -r .active.authority_id) || fail-now "Failed to fetch prepared JWT authority ID" |
| 6 | + |
| 7 | +svid_json=$(docker compose exec spire-agent ./bin/spire-agent \ |
| 8 | + api fetch jwt -audience aud -output json) || fail-now "Failed to fetch JWT SVID" |
| 9 | + |
| 10 | +jwt_svid=$(echo $svid_json | jq -c '.[0].svids[0].svid') || fail-now "Failed to parse JWT SVID" |
| 11 | + |
| 12 | +# Store JWT SVID for the next steps |
| 13 | +echo $jwt_svid > conf/agent/jwt_svid |
| 14 | + |
| 15 | +# Extract key ID from JWT SVID |
| 16 | +skid=$(echo "$jwt_svid" | jq -r 'split(".") | .[0] | @base64d | fromjson | .kid') |
| 17 | + |
| 18 | +# Check if the key ID matches the prepared authority ID |
| 19 | +if [[ $skid != $prepared_authority ]]; then |
| 20 | + fail-now "JWT SVID key ID does not match the prepared authority ID, got $skid, expected $prepared_authority" |
| 21 | +fi |
| 22 | + |
| 23 | +keys=$(echo $svid_json | jq -c '.[1].bundles["spiffe://domain.test"] | @base64d | fromjson') |
| 24 | + |
| 25 | +retry_count=0 |
| 26 | +max_retries=20 |
| 27 | +success=false |
| 28 | + |
| 29 | +while [[ $retry_count -lt $max_retries ]]; do |
| 30 | + keysLen=$(echo $keys | jq -c '.keys | length') |
| 31 | + if [[ $keysLen -eq 2 ]]; then |
| 32 | + success=true |
| 33 | + break |
| 34 | + else |
| 35 | + echo "Retrying... ($((retry_count+1))/$max_retries)" |
| 36 | + retry_count=$((retry_count+1)) |
| 37 | + sleep 2 |
| 38 | + # Re-fetch the JWT SVID and keys |
| 39 | + svid_json=$(docker compose exec spire-agent ./bin/spire-agent \ |
| 40 | + api fetch jwt -audience aud -output json) || fail-now "Failed to re-fetch JWT SVID" |
| 41 | + jwt_svid=$(echo $svid_json | jq -c '.[0].svids[0].svid') || fail-now "Failed to parse re-fetched JWT SVID" |
| 42 | + keys=$(echo $svid_json | jq -c '.[1].bundles["spiffe://domain.test"] | @base64d | fromjson') |
| 43 | + fi |
| 44 | +done |
| 45 | + |
| 46 | +if [[ $success == false ]]; then |
| 47 | + fail-now "Expected one key in JWT SVID bundle, got $keysLen after $max_retries retries" |
| 48 | +fi |
| 49 | + |
| 50 | +echo $keys | jq --arg kid $prepared_authority -e '.keys[] | select(.kid == $kid)' > /dev/null || fail-now "Prepared authority not found in JWT SVID bundle" |
0 commit comments