2024年4月、MicrosoftがCI/CD可能なコード署名サービスを提供開始しました。それがTrusted Signingです。
2023年6月のコード署名要件変更により、通常のコードサイニング証明書購入プロセスではCI/CDは困難であることから、心強い味方です。
サービス料金だけ見ても証明書を購入するより安価なことも見逃せません。
この記事ではTrusted SigningでCertificate Profileが作成できていることを前提として、
それを用いてGitHub Actionsで署名するところまで記載します。
AzureのセットアップからTrusted SigningでCertificate Profileを作成するまでは以下の記事です。
公式Actionの活用
MSが提供してるTrusted Signing actionを使います。
yaml例
mainにpushされたときにOIDCを使ってTrusted Signingにアクセスして署名する
署名したものをartifactとしてuploadする
distにあるexe等を署名する前提
署名後はexe上書きになります。
permissions:
id-token: write
contents: read
on:
push:
branches: [main]
jobs:
build-and-sign:
runs-on: windows-latest
name: Build app and sign files with Trusted Signing
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Azure login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Sign files with Trusted Signing
uses: azure/trusted-signing-action@v0.3.19
with:
endpoint: https://eus.codesigning.azure.net/
trusted-signing-account-name: vscx-codesigning
certificate-profile-name: vscx-certificate-profile
files-folder: ${{ github.workspace }}\dist
files-folder-filter: exe,dll
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
exclude-environment-credential: true
exclude-workload-identity-credential: true
exclude-managed-identity-credential: true
exclude-shared-token-cache-credential: true
exclude-visual-studio-credential: true
exclude-visual-studio-code-credential: true
exclude-azure-cli-credential: false
exclude-azure-powershell-credential: true
exclude-azure-developer-cli-credential: true
exclude-interactive-browser-credential: true
- name: upload
uses: actions/upload-artifact@v4
with:
name: upload
path: dist
OIDC化準備
おおよそAWSでのOIDCと同じです
Azure側作業
まずAzure側でCI/CD用のサービスプリンシパル(アプリケーション)を作り、
利用したいCertificate ProfileのIAMでTrusted Signing Certificate Profile Signer
ロールをアプリに付与。
その後該当アプリのフェデレーション資格情報を作成し、Azure リソースをデプロイする GitHub Actions
を選び、必要事項を入力する。
Azureの場合クレームで必要な情報をWebUIで打ち込めるのでAWSよりわかりやすいですね
AWS同様、フェデレーションがあればclient secretは不要です
シークレットをGitHub Actionsに登録
Azureで登録したアプリケーションの概要欄からclient-idとtenant-idは取得できます。
subscription-idはTrustedSigningで使っているsubscriptionのidです。
GitHub Actionsのシークレットに登録しておきましょう。
細かいyaml解説
- yamlの
exclude〜
は不要な認証手段を無効化することで高速化します - endpointはTrustedSigningを設定したリージョンごとに異なります
- 以下はreadmeから引っ張ってきているだけなので自分で命名したものに変えましょう
trusted-signing-account-name: vscx-codesigning
certificate-profile-name: vscx-certificate-profile
最初にあるpermissionsはOIDC用です
他のTrustedSigning actionで使えるパラメータはactionのreadmeを参照してください