tech1分で読める

GitHub AppsのJWTをローカルで生成する(bash + openssl)

GitHub Appのinstallation tokenを取得するためのJWTを、bash + opensslで最小構成で生成するメモ。

#GitHub#GitHub Apps#JWT#bash#openssl

GitHub AppsのJWTをローカルで生成する(bash + openssl)

GitHub App の installation token を取得するには、まず GitHub App の JWT(RS256) が必要です。
手元でサクッと作る用のメモ。

#!/bin/bash

set -euo pipefail

# GitHub App settings から取得
client_id=""          # App ID(もしくは Client ID 相当の値)
installation_id=""    # Installation ID

# GitHub App の秘密鍵(PEM)
pem_file="./xxx.pem"
[ -f "${pem_file}" ] || { echo "PEM file not found: ${pem_file}" >&2; exit 1; }

now=$(date +%s)
iat=$((now - 60))
exp=$((now + 600))

b64enc() { openssl base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n'; }

header_json='{"typ":"JWT","alg":"RS256"}'
header=$(printf '%s' "${header_json}" | b64enc)

payload_json="{\"iat\":${iat},\"exp\":${exp},\"iss\":\"${client_id}\"}"
payload=$(printf '%s' "${payload_json}" | b64enc)

header_payload="${header}.${payload}"
signature=$(printf '%s' "${header_payload}" | openssl dgst -sha256 -sign "${pem_file}" | b64enc)

JWT="${header_payload}.${signature}"
printf '%s\n' "JWT: ${JWT}"

# installation token request
curl --request POST \
  --url "https://api.github.com/app/installations/${installation_id}/access_tokens" \
  --header "Accept: application/vnd.github+json" \
  --header "Authorization: Bearer ${JWT}" \
  --header "X-GitHub-Api-Version: 2022-11-28"

RK

1997年生まれ

ITエンジニア

インフラ・SRE