Skip to content

Commit 118bc1e

Browse files
committed
[ci] fix JCA signing: workload identity auth, -J-cp classpath, OIDC token file
1 parent 6d027b3 commit 118bc1e

2 files changed

Lines changed: 44 additions & 10 deletions

File tree

.github/workflows/ci-oidc-smoke.yml

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,30 +68,49 @@ jobs:
6868
jar cf smoke.jar canary.txt
6969
ls -la smoke.jar
7070
71+
- name: Write OIDC token for JCA workload identity
72+
run: |
73+
# azure-security-keyvault-jca reads workload identity credentials from
74+
# env vars: AZURE_FEDERATED_TOKEN_FILE + AZURE_CLIENT_ID + AZURE_TENANT_ID.
75+
# azure/login doesn't write the token file, so we do it here.
76+
TOKEN=$(curl -sS -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
77+
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=api://AzureADTokenExchange" \
78+
| jq -r '.value')
79+
[ -n "$TOKEN" ] || { echo "Failed to obtain OIDC token"; exit 1; }
80+
echo "$TOKEN" > /tmp/azure-oidc-token.txt
81+
chmod 600 /tmp/azure-oidc-token.txt
82+
echo "AZURE_FEDERATED_TOKEN_FILE=/tmp/azure-oidc-token.txt" >> "$GITHUB_ENV"
83+
7184
- name: Sign smoke JAR with Azure Key Vault JCA
7285
env:
7386
AZURE_KEYVAULT_URI: ${{ vars.AZURE_KEYVAULT_URI }}
7487
AZURE_KEYVAULT_CERT_NAME: ${{ vars.AZURE_KEYVAULT_CERT_NAME }}
88+
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
89+
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
7590
run: |
76-
# Mirrors ci-release.yml:223-247 (Sign installer JAR step)
91+
# -J-cp requires two separate -J tokens: one for the flag, one for the value.
92+
# --module-path does NOT work for non-modular JARs (JCA SPI not registered).
93+
# Auth via workload identity: AZURE_FEDERATED_TOKEN_FILE + AZURE_CLIENT_ID + AZURE_TENANT_ID.
7794
KV_JCA_JAR="$HOME/.m2/repository/com/azure/azure-security-keyvault-jca/2.10.0/azure-security-keyvault-jca-2.10.0.jar"
7895
if [ ! -f "$KV_JCA_JAR" ]; then
7996
mvn -q dependency:get \
8097
-Dartifact=com.azure:azure-security-keyvault-jca:2.10.0:jar
8198
fi
8299
ls -la "$KV_JCA_JAR"
83100
jarsigner \
84-
-J--module-path="${KV_JCA_JAR}" \
85-
-J--add-modules="com.azure.security.keyvault.jca" \
101+
-J-cp -J"${KV_JCA_JAR}" \
102+
-J-Dazure.keyvault.uri="${AZURE_KEYVAULT_URI}" \
86103
-keystore NONE \
87104
-storetype AzureKeyVault \
88105
-storepass "" \
89-
-providerName AzureKeyVault \
90106
-providerClass com.azure.security.keyvault.jca.KeyVaultJcaProvider \
91-
-J-Dazure.keyvault.uri="${AZURE_KEYVAULT_URI}" \
92107
-tsa http://timestamp.sectigo.com/ \
93108
/tmp/smoke/smoke.jar "$AZURE_KEYVAULT_CERT_NAME"
94109
110+
- name: Remove OIDC token file
111+
if: always()
112+
run: rm -f /tmp/azure-oidc-token.txt
113+
95114
- name: Verify smoke JAR signature
96115
run: |
97116
jarsigner -verify -strict -verbose /tmp/smoke/smoke.jar | tail -20

.github/workflows/ci-release.yml

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,34 +221,49 @@ jobs:
221221
-Dlicense.skip=true \
222222
clean package
223223
224+
- name: Write OIDC token for JCA workload identity
225+
shell: bash
226+
run: |
227+
TOKEN=$(curl -sS -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
228+
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=api://AzureADTokenExchange" \
229+
| jq -r '.value')
230+
[ -n "$TOKEN" ] || { echo "Failed to obtain OIDC token"; exit 1; }
231+
echo "$TOKEN" > /tmp/azure-oidc-token.txt
232+
chmod 600 /tmp/azure-oidc-token.txt
233+
echo "AZURE_FEDERATED_TOKEN_FILE=/tmp/azure-oidc-token.txt" >> "$GITHUB_ENV"
234+
224235
- name: Sign installer JAR (Azure Key Vault JCA)
225236
shell: bash
226237
env:
227238
AZURE_KEYVAULT_URI: ${{ vars.AZURE_KEYVAULT_URI }}
239+
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
240+
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
228241
run: |
229242
JAR=$(find exist-installer/target -name "*.jar" \
230243
-not -name "*sources*" -not -name "*javadoc*" | head -1)
231244
[ -n "$JAR" ] || { echo "No installer JAR found in exist-installer/target"; exit 1; }
232-
# Download Azure Key Vault JCA provider to classpath
233245
KV_JCA_JAR="$HOME/.m2/repository/com/azure/azure-security-keyvault-jca/2.10.0/azure-security-keyvault-jca-2.10.0.jar"
234246
if [ ! -f "$KV_JCA_JAR" ]; then
235247
mvn -q dependency:get \
236248
-Dartifact=com.azure:azure-security-keyvault-jca:2.10.0:jar
237249
fi
238250
CERT_NAME="${{ vars.AZURE_KEYVAULT_CERT_NAME }}"
239251
jarsigner \
240-
-J--module-path="${KV_JCA_JAR}" \
241-
-J--add-modules="com.azure.security.keyvault.jca" \
252+
-J-cp -J"${KV_JCA_JAR}" \
253+
-J-Dazure.keyvault.uri="${AZURE_KEYVAULT_URI}" \
242254
-keystore NONE \
243255
-storetype AzureKeyVault \
244256
-storepass "" \
245-
-providerName AzureKeyVault \
246257
-providerClass com.azure.security.keyvault.jca.KeyVaultJcaProvider \
247-
-J-Dazure.keyvault.uri="${AZURE_KEYVAULT_URI}" \
248258
-tsa http://timestamp.sectigo.com/ \
249259
"$JAR" "$CERT_NAME"
250260
jarsigner -verify -strict "$JAR"
251261
262+
- name: Remove OIDC token file
263+
if: always()
264+
shell: bash
265+
run: rm -f /tmp/azure-oidc-token.txt
266+
252267
- name: Sign .exe with Authenticode (AzureSignTool)
253268
shell: pwsh
254269
env:

0 commit comments

Comments
 (0)