Skip to content

Commit 67c7174

Browse files
committed
feat: add code signing into the Windows build
1 parent aade309 commit 67c7174

File tree

2 files changed

+122
-8
lines changed

2 files changed

+122
-8
lines changed

.github/workflows/build-test.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ on:
3838
branches: main
3939
types: [opened, synchronize, reopened, ready_for_review]
4040
paths:
41-
# - '.github/workflows/build-test.yaml' # Don't trigger normal tests on this branch, it is only for code signing logic
41+
- '.github/workflows/build-test.yaml'
4242
- '**/Cargo.toml'
4343
- '**/Cargo.lock'
4444
- '**.rs'
45-
# - '**.yaml' # Don't trigger normal tests on this branch, it is only for code signing logic
45+
- '**.yaml'
4646
- '**.hs'
4747
- 'concordium-base'
4848
- 'concordium-consensus/smart-contracts'

.github/workflows/release.yaml

Lines changed: 120 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ jobs:
242242
path: ${{ env.ARTIFACT_NAME }}
243243

244244
node-windows:
245-
runs-on: windows-latest
245+
runs-on: windows-latest
246+
environment: release # This step needs to use the release context to access credentials for code signing.
246247
needs: [validate-preconditions]
247248
if: contains(fromJSON('["rc", "alpha", "node-windows"]'), needs.validate-preconditions.outputs.release_type)
248249
defaults:
@@ -254,17 +255,47 @@ jobs:
254255
with:
255256
submodules: recursive
256257

257-
- name: Install dependencies
258-
run: |
259-
choco install yq jq -y
260-
shell: bash
261-
262258
- name: Extrapolate artifact name
263259
run: |
264260
ARTIFACT_NAME=$(echo '${{ needs.validate-preconditions.outputs.s3_arns }}' | jq -r '.["${{ github.job }}"].name')
265261
echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV
266262
shell: bash
267263

264+
- name: Install DigiCert Client tools (Windows only)
265+
id: digicert_client
266+
uses: digicert/[email protected]
267+
268+
- name: Import Windows certificate (Windows only)
269+
id: windows_certificate
270+
env:
271+
# Base64 encoding of the pfx/p12 certificate for Windows code signing.
272+
SM_CLIENT_CERT_FILE_B64: ${{ secrets.WINDOWS_SM_CLIENT_CERT_FILE_B64 }}
273+
run: |
274+
$CERTIFICATE_PATH_BASE64="$env:RUNNER_TEMP\cert-b64.txt"
275+
$CERTIFICATE_PATH="$env:RUNNER_TEMP\cert.pfx"
276+
277+
Set-Content -Path $CERTIFICATE_PATH_BASE64 -Value $env:SM_CLIENT_CERT_FILE_B64
278+
certutil -decode $CERTIFICATE_PATH_BASE64 $CERTIFICATE_PATH
279+
echo "CERTIFICATE_PATH=$CERTIFICATE_PATH" >> $env:GITHUB_OUTPUT
280+
281+
- name: Run smctl healthcheck to confirm if the tool is configured properly.
282+
working-directory: ${{steps.build.outputs.bin_dir}}
283+
env:
284+
WINDOWS_PKCS11_CONFIG: ${{ steps.digicert_client.outputs.PKCS11_CONFIG }}
285+
WINDOWS_SM_KEYPAIR_ALIAS: ${{ secrets.WINDOWS_SM_KEYPAIR_ALIAS }}
286+
SM_HOST: ${{ vars.WINDOWS_SM_HOST }}
287+
SM_API_KEY: ${{ secrets.WINDOWS_SM_API_KEY }}
288+
SM_CLIENT_CERT_FILE: ${{ steps.windows_certificate.outputs.CERTIFICATE_PATH }}
289+
SM_CLIENT_CERT_PASSWORD: ${{ secrets.WINDOWS_SM_CLIENT_CERT_PASSWORD }}
290+
run: |
291+
smctl healthcheck --all
292+
shell: cmd
293+
294+
- name: Install dependencies
295+
run: |
296+
choco install yq jq -y
297+
shell: bash
298+
268299
- name: Install Rust
269300
uses: actions-rust-lang/setup-rust-toolchain@v1
270301
with:
@@ -314,6 +345,89 @@ jobs:
314345
- name: Build Windows Node
315346
run: |
316347
./scripts/distribution/windows/build-all.ps1 -nodeVersion ${{ needs.validate-preconditions.outputs.version }} -rustVersion ${{ env.RUST_VERSION }}
348+
349+
- name: Extract files to prepare for signing
350+
run: |
351+
dir service\windows\installer
352+
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\MsiDb.exe" -d service\windows\installer/Node.msi -x Node.cab
353+
mkdir Node
354+
dir
355+
expand -d Node.cab
356+
expand -F:* Node.cab ./Node
357+
dir Node
358+
shell: cmd
359+
360+
- name: Rename files to prepare for signing
361+
run: |
362+
mv ./Node/ConcordiumConsensusDLL ./Node/ConcordiumConsensusDLL.dll
363+
mv ./Node/ConcordiumBaseDLL ./Node/ConcordiumBaseDLL.dll
364+
mv ./Node/ConcordiumSmartContractEngineDLL ./Node/ConcordiumSmartContractEngineDLL.dll
365+
mv ./Node/Sha2DLL ./Node/Sha2DLL.dll
366+
mv ./Node/NodeRunnerService ./Node/NodeRunnerService.exe
367+
mv ./Node/NodeCollector ./Node/NodeCollector.exe
368+
mv ./Node/ConcordiumNode ./Node/ConcordiumNode.exe
369+
370+
- name: Sign files with smctl
371+
working-directory: ${{steps.build.outputs.bin_dir}}
372+
env:
373+
WINDOWS_PKCS11_CONFIG: ${{ steps.digicert_client.outputs.PKCS11_CONFIG }}
374+
WINDOWS_SM_KEYPAIR_ALIAS: ${{ secrets.WINDOWS_SM_KEYPAIR_ALIAS }}
375+
SM_HOST: ${{ vars.WINDOWS_SM_HOST }}
376+
SM_API_KEY: ${{ secrets.WINDOWS_SM_API_KEY }}
377+
SM_CLIENT_CERT_FILE: ${{ steps.windows_certificate.outputs.CERTIFICATE_PATH }}
378+
SM_CLIENT_CERT_PASSWORD: ${{ secrets.WINDOWS_SM_CLIENT_CERT_PASSWORD }}
379+
SM_ARGS: "--verbose --exit-non-zero-on-fail --failfast"
380+
run: |
381+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/ConcordiumConsensusDLL.dll --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
382+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/ConcordiumBaseDLL.dll --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
383+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/ConcordiumSmartContractEngineDLL.dll --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
384+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/Sha2DLL.dll --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
385+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/NodeRunnerService.exe --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
386+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/NodeCollector.exe --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
387+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./Node/ConcordiumNode.exe --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
388+
shell: cmd
389+
390+
- name: Rename files back to their original form without extension.
391+
run: |
392+
mv ./Node/ConcordiumConsensusDLL.dll ./Node/ConcordiumConsensusDLL
393+
mv ./Node/ConcordiumBaseDLL.dll ./Node/ConcordiumBaseDLL
394+
mv ./Node/ConcordiumSmartContractEngineDLL.dll ./Node/ConcordiumSmartContractEngineDLL
395+
mv ./Node/Sha2DLL.dll ./Node/Sha2DLL
396+
mv ./Node/NodeRunnerService.exe ./Node/NodeRunnerService
397+
mv ./Node/NodeCollector.exe ./Node/NodeCollector
398+
mv ./Node/ConcordiumNode.exe ./Node/ConcordiumNode
399+
400+
- name: Recreate the cabinet file.
401+
run: |
402+
dir Node /b /a-d > cabfiles.txt
403+
makecab.exe /D MaxDiskSize=0 /D Cabinet=ON /D Compress=ON /D CabinetName1=Node.cab /D SourceDir=Node /f cabfiles.txt
404+
shell: cmd
405+
406+
- name: Repackage the cabinet file.
407+
run: |
408+
del Node.cab
409+
move disk1\Node.cab .
410+
expand -d Node.cab
411+
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\MsiDb.exe" -d service\windows\installer\Node.msi -k Node.cab
412+
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\MsiDb.exe" -d service\windows\installer\Node.msi -a Node.cab
413+
shell: cmd
414+
415+
- name: Sign files with smctl
416+
working-directory: ${{steps.build.outputs.bin_dir}}
417+
env:
418+
WINDOWS_PKCS11_CONFIG: ${{ steps.digicert_client.outputs.PKCS11_CONFIG }}
419+
WINDOWS_SM_KEYPAIR_ALIAS: ${{ secrets.WINDOWS_SM_KEYPAIR_ALIAS }}
420+
SM_HOST: ${{ vars.WINDOWS_SM_HOST }}
421+
SM_API_KEY: ${{ secrets.WINDOWS_SM_API_KEY }}
422+
SM_CLIENT_CERT_FILE: ${{ steps.windows_certificate.outputs.CERTIFICATE_PATH }}
423+
SM_CLIENT_CERT_PASSWORD: ${{ secrets.WINDOWS_SM_CLIENT_CERT_PASSWORD }}
424+
SM_ARGS: "--verbose --exit-non-zero-on-fail --failfast"
425+
run: |
426+
smctl sign --keypair-alias ${{ env.WINDOWS_SM_KEYPAIR_ALIAS }} --input ./service/windows/installer/Node.msi --config-file ${{ env.WINDOWS_PKCS11_CONFIG }} ${{ env.SM_ARGS }}
427+
shell: cmd
428+
429+
- name: Rename the package to target filename.
430+
run: |
317431
cp ./service/windows/installer/Node.msi ./${{ env.ARTIFACT_NAME }}
318432
319433
- name: Upload artifact

0 commit comments

Comments
 (0)