Skip to content

Commit 46d3999

Browse files
authored
Chore: [AEA-0000] - new script to create jwks and new prod jwks (#1946)
## Summary - Routine Change ### Details - new script to create jwks - new prod jwks file
1 parent ddd1fe8 commit 46d3999

File tree

5 files changed

+58
-25
lines changed

5 files changed

+58
-25
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ jobs:
191191
APIGEE_PRESCRIPTIONS_ENDPOINT: "https://int.api.service.nhs.uk/clinical-prescription-tracker/"
192192
APIGEE_PDS_ENDPOINT: "https://int.api.service.nhs.uk/personal-demographics/FHIR/R4/"
193193
APIGEE_DOHS_ENDPOINT: "https://int.api.service.nhs.uk/service-search-api/"
194-
JWT_KID: "eps-cpt-ui-int"
194+
JWT_KID: "eps-cptui-int-2026-03-23"
195195
ROLE_ID: "555254242106"
196196
LOG_LEVEL: "DEBUG"
197197
RUN_REGRESSION_TESTS: false
@@ -225,7 +225,7 @@ jobs:
225225
APIGEE_PRESCRIPTIONS_ENDPOINT: "https://api.service.nhs.uk/clinical-prescription-tracker/"
226226
APIGEE_PDS_ENDPOINT: "https://api.service.nhs.uk/personal-demographics/FHIR/R4/"
227227
APIGEE_DOHS_ENDPOINT: "https://api.service.nhs.uk/service-search-api/"
228-
JWT_KID: "eps-cpt-ui-prod"
228+
JWT_KID: "eps-cptui-prod-2026-03-23"
229229
ROLE_ID: "555254242106"
230230
LOG_LEVEL: "DEBUG"
231231
RUN_REGRESSION_TESTS: false

packages/staticContent/jwks/int/jwks.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
"alg": "RS512",
1616
"kid": "eps-cpt-ui-int",
1717
"use": "sig"
18+
},
19+
{
20+
"kty": "RSA",
21+
"n": "uMK5OqjCPb8oz3U3nFDCXHp5K8cm_NG2pzTHjE1Cf-nuKNLnkJgxVOvYamCL9s4IFqMBl6vnJBWe-CjuE0JJa736qmPhX6MvtuVYRxbm6N18s-mhjBvk5EkAXfi5jYTTY75BsqQpvnOFJFDfc5fxHGprYqo0O0xc5CbAXFVf-xrXXNCr5_RaTlreDq7vZhcWHEuI023bAYyH9MHDUx27r6U88VF67lWtvE7ERXxx5f6dBqvNzPDhBXLAFriUHto_41MZ8XD_oG7AktXlFZngBhTgppy6C7TkOvS-8az704fmdr49ZEzKz34FW6GcIslms4oxgvtm2adGrhjnHpZEcw-3TYPCA4-D4GTRJBcStpBgwwE9eRZ_8KPE9IjCzV2f93DVagjA7_Ndq8GFLoKX9Z12wHbJX4rv4XbOvlFmaFEIpqF9nGV3u3WYaNZe_3XTlyVQ_83kyrpB6X7gXDpSTZHN40PekN6MhojoJRrHthrxSktCi155P9yZTWrRZ5hZd1T-0OwSOXeMJ40my823B-Tts7LmbHeD6LX7wd4wc8yMz3eZ5U91hCM2P3Eir_t58kjX53Q9yoAhgxzaj45wBw9OGO8jFsebGsljLZY4TR6Pw_uVRJGovqm3NQamB0Vxetzyj7r5JiNcKOXVUn1ioKJgZyD5bXUaTJVHTk7Xrcs",
22+
"e": "AQAB",
23+
"alg": "RS512",
24+
"kid": "eps-cptui-int-2026-03-23",
25+
"use": "sig"
1826
}
1927
]
2028
}

packages/staticContent/jwks/prod/jwks.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
"alg": "RS512",
88
"kid": "eps-cpt-ui-prod",
99
"use": "sig"
10+
},
11+
{
12+
"kty": "RSA",
13+
"n": "sVi07i71VeUejD1uVSsGY-kkinmnz6eoCvfliFhd1v6IWkPfS5cYz4UTS38xCzHPQQRicAoh2hwDlyrQbAXV_8PIzb6ZBg-sdFFeLkHvcHeqb__ldVTrq4zhEZ7Ni1IODvuIUU7QQ_GTHZglH34isi9DD7XPH0P5WlwKdYsQ5TI11lJXMTsjIkC7FzXuyF5_wJe6zJRQtUcTzW2IAZtiRWsWZFv7JGfXDyOH35bcGrHu6htJvOzUx2JTUBP7ws2fy8VvSc6KUkHKMaYyx-Kf9Njq3vswRT-Oqx4b6hJO6xyK4X1aEKQEa7BC0w6FuESbq-OqvEkjaFIaNVu8QHucsMyHtXtBiaFKA2dgwS7UOPDyftnaBzudrlcaz1vJ61Fy7XXxrjqEbbxjax7_sqlq3Eh2xeVnI4iqozqOfISPDwYLZI3TEv1-YTypZ4BUWqqGnvF3kn5G5nr5lz04UvHJsfStBr_j4XwsHHKAEmk3dWywqU51qnfcQt0pWH9mcwR50DuTVgzirkRgIPV-sDtwLhiMNhtHE7dGmDMTIQg8OhD6cNyOXpqPmvDSGCwfxA4NvX74b_nbZbaJ55cIEogqVfYE0nXlNdLWWBFBDEqcYpMB0QsH8dOCNxajv6OrpGzclvSW2sYRkyeHUzGImN8ubAeulfHseGjEoJdLFzxzMws",
14+
"e": "AQAB",
15+
"alg": "RS512",
16+
"kid": "eps-cptui-prod-2026-03-23",
17+
"use": "sig"
1018
}
1119
]
1220
}

scripts/create_new_jwks.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env bash
2+
3+
ENVIRONMENT=${1:?"Usage: $0 <environment>"}
4+
CURRENT_DATE=$(date +"%Y-%m-%d")
5+
KID="eps-cptui-${ENVIRONMENT}-${CURRENT_DATE}"
6+
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
7+
REPO_ROOT=$(cd "$SCRIPT_DIR/.." && pwd)
8+
SECRETS_DIR="$REPO_ROOT/.secrets"
9+
JWKS_FILE="$REPO_ROOT/packages/staticContent/jwks/${ENVIRONMENT}/jwks.json"
10+
11+
if ! command -v jq >/dev/null 2>&1; then
12+
echo "jq is required to update the JWKS file" >&2
13+
exit 1
14+
fi
15+
16+
if [ ! -f "$JWKS_FILE" ]; then
17+
echo "JWKS file not found for environment '$ENVIRONMENT' at $JWKS_FILE" >&2
18+
exit 1
19+
fi
20+
21+
mkdir -p "$SECRETS_DIR"
22+
23+
openssl genrsa -out "$SECRETS_DIR/$KID.pem" 4096
24+
openssl rsa -in "$SECRETS_DIR/$KID.pem" -pubout -outform PEM -out "$SECRETS_DIR/$KID.pem.pub"
25+
MODULUS=$(
26+
openssl rsa -pubin -in "$SECRETS_DIR/$KID.pem.pub" -noout -modulus `# Print modulus of public key` \
27+
| cut -d '=' -f2 `# Extract modulus value from output` \
28+
| xxd -r -p `# Convert from string to bytes` \
29+
| openssl base64 -A `# Base64 encode without wrapping lines` \
30+
| sed 's|+|-|g; s|/|_|g; s|=||g' `# URL encode as JWK standard requires`
31+
)
32+
33+
TMP_JWKS=$(mktemp)
34+
35+
jq --arg n "$MODULUS" \
36+
--arg kid "$KID" \
37+
'.keys += [{"kty":"RSA","n":$n,"e":"AQAB","alg":"RS512","kid":$kid,"use":"sig"}]' \
38+
"$JWKS_FILE" > "$TMP_JWKS"
39+
40+
mv "$TMP_JWKS" "$JWKS_FILE"

scripts/set_secrets.sh

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,11 @@ get_deploy_role() {
8686
echo "${CLOUD_FORMATION_DEPLOY_ROLE}"
8787
}
8888

89-
get_cdk_image_pull_role() {
90-
environment=$1
91-
# shellcheck disable=SC2016
92-
CDK_PULL_IMAGE_ROLE=$(aws cloudformation list-exports \
93-
--profile prescription-"${environment}" \
94-
--query 'Exports[?Name==`ci-resources:CDKPullImageRole`].Value' \
95-
--output text)
96-
97-
echo "${CDK_PULL_IMAGE_ROLE}"
98-
}
99-
10089
check_gh_logged_in
10190

10291
# dev and dev-pr
10392
DEV_DEPLOY_ROLE=$(get_deploy_role dev)
104-
DEV_CDK_PULL_IMAGE_ROLE=$(get_cdk_image_pull_role dev)
10593

106-
set_environment_secret CDK_PULL_IMAGE_ROLE "${DEV_CDK_PULL_IMAGE_ROLE}" dev-pr
10794
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${DEV_DEPLOY_ROLE}" dev-pr
10895
set_environment_secret CIS2_OIDC_CLIENT_ID "${DEV_CIS2_OIDC_CLIENT_ID}" dev-pr
10996
set_environment_secret MOCK_OIDC_CLIENT_ID "${DEV_MOCK_CLIENT_ID}" dev-pr
@@ -114,7 +101,6 @@ set_environment_secret APIGEE_DOHS_API_KEY "${APIGEE_PTL_DOHS_API_KEY}" dev-pr
114101
set_environment_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" dev-pr
115102
set_environment_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" dev-pr
116103

117-
set_repository_secret CDK_PULL_IMAGE_ROLE "${DEV_CDK_PULL_IMAGE_ROLE}" dependabot
118104
set_repository_secret CLOUD_FORMATION_DEPLOY_ROLE "${DEV_DEPLOY_ROLE}" dependabot
119105
set_repository_secret CIS2_OIDC_CLIENT_ID "${DEV_CIS2_OIDC_CLIENT_ID}" dependabot
120106
set_repository_secret MOCK_OIDC_CLIENT_ID "${DEV_MOCK_CLIENT_ID}" dependabot
@@ -125,7 +111,6 @@ set_repository_secret APIGEE_DOHS_API_KEY "${APIGEE_PTL_DOHS_API_KEY}" dependabo
125111
set_repository_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" dependabot
126112
set_repository_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" dependabot
127113

128-
set_environment_secret CDK_PULL_IMAGE_ROLE "${DEV_CDK_PULL_IMAGE_ROLE}" dev
129114
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${DEV_DEPLOY_ROLE}" dev
130115
set_environment_secret CIS2_OIDC_CLIENT_ID "${DEV_CIS2_OIDC_CLIENT_ID}" dev
131116
set_environment_secret MOCK_OIDC_CLIENT_ID "${DEV_MOCK_CLIENT_ID}" dev
@@ -137,8 +122,6 @@ set_environment_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" dev
137122
set_environment_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" dev
138123

139124
QA_DEPLOY_ROLE=$(get_deploy_role qa)
140-
QA_CDK_PULL_IMAGE_ROLE=$(get_cdk_image_pull_role qa)
141-
set_environment_secret CDK_PULL_IMAGE_ROLE "${QA_CDK_PULL_IMAGE_ROLE}" qa
142125
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${QA_DEPLOY_ROLE}" qa
143126
set_environment_secret CIS2_OIDC_CLIENT_ID "${QA_CIS2_OIDC_CLIENT_ID}" qa
144127
set_environment_secret MOCK_OIDC_CLIENT_ID "${QA_MOCK_CLIENT_ID}" qa
@@ -150,8 +133,6 @@ set_environment_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" qa
150133
set_environment_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" qa
151134

152135
REF_DEPLOY_ROLE=$(get_deploy_role ref)
153-
REF_CDK_PULL_IMAGE_ROLE=$(get_cdk_image_pull_role ref)
154-
set_environment_secret CDK_PULL_IMAGE_ROLE "${REF_CDK_PULL_IMAGE_ROLE}" ref
155136
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${REF_DEPLOY_ROLE}" ref
156137
set_environment_secret CIS2_OIDC_CLIENT_ID "${QA_CIS2_OIDC_CLIENT_ID}" ref
157138
set_environment_secret MOCK_OIDC_CLIENT_ID "${QA_MOCK_CLIENT_ID}" ref
@@ -163,8 +144,6 @@ set_environment_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" ref
163144
set_environment_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" ref
164145

165146
INT_DEPLOY_ROLE=$(get_deploy_role int)
166-
INT_CDK_PULL_IMAGE_ROLE=$(get_cdk_image_pull_role int)
167-
set_environment_secret CDK_PULL_IMAGE_ROLE "${INT_CDK_PULL_IMAGE_ROLE}" int
168147
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${INT_DEPLOY_ROLE}" int
169148
set_environment_secret CIS2_OIDC_CLIENT_ID "${INT_CIS2_OIDC_CLIENT_ID}" int
170149
set_environment_secret MOCK_OIDC_CLIENT_ID "${INT_MOCK_CLIENT_ID}" int
@@ -176,8 +155,6 @@ set_environment_secret CLOUDFRONT_ORIGIN_CUSTOM_HEADER "$(uuidgen)" int
176155
set_environment_private_key_secret REGRESSION_TESTS_PEM ".secrets/eps-regression-testing.private-key.pem" int
177156

178157
PROD_DEPLOY_ROLE=$(get_deploy_role prod)
179-
PROD_CDK_PULL_IMAGE_ROLE=$(get_cdk_image_pull_role prod)
180-
set_environment_secret CDK_PULL_IMAGE_ROLE "${PROD_CDK_PULL_IMAGE_ROLE}" prod
181158
set_environment_secret CLOUD_FORMATION_DEPLOY_ROLE "${PROD_DEPLOY_ROLE}" prod
182159
set_environment_secret CIS2_OIDC_CLIENT_ID "${PROD_CIS2_OIDC_CLIENT_ID}" prod
183160
set_environment_secret MOCK_OIDC_CLIENT_ID "${PROD_MOCK_CLIENT_ID}" prod

0 commit comments

Comments
 (0)