@@ -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+ 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