GitHubActionsでTrustedSigningを使いコード署名する

2024年4月、MicrosoftがCI/CD可能なコード署名サービスを提供開始しました。それがTrusted Signingです。

https://mspoweruser.com/ja/microsoft-trusted-signing-service-formerly-azure-code-signing-is-finally-available-in-public-preview

2023年6月のコード署名要件変更により、通常のコードサイニング証明書購入プロセスではCI/CDは困難であることから、心強い味方です。
サービス料金だけ見ても証明書を購入するより安価なことも見逃せません。

この記事ではTrusted SigningでCertificate Profileが作成できていることを前提として、
それを用いてGitHub Actionsで署名するところまで記載します。

AzureのセットアップからTrusted SigningでCertificate Profileを作成するまでは以下の記事です。

https://qiita.com/yoshi-taka/items/487cb94f8f60d016eaa1

# 公式Actionの活用

MSが提供してるTrusted Signing actionを使います。

https://github.com/marketplace/actions/trusted-signing

# yaml例

mainにpushされたときにOIDCを使ってTrusted Signingにアクセスして署名する
署名したものをartifactとしてuploadする
distにあるexe等を署名する前提
署名後はexe上書きになります。

```yaml
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化準備

https://github.com/Azure/trusted-signing-action/issues/27


おおよそAWSでのOIDCと同じです

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-azure


## Azure側作業
まずAzure側でCI/CD用のサービスプリンシパル(アプリケーション)を作り、
利用したいCertificate ProfileのIAMで`Trusted Signing Certificate Profile Signer`ロールをアプリに付与。

https://learn.microsoft.com/en-us/entra/identity-platform/howto-create-service-principal-portal


その後該当アプリのフェデレーション資格情報を作成し、`Azure リソースをデプロイする GitHub Actions`を選び、必要事項を入力する。

https://learn.microsoft.com/ja-jp/azure/developer/github/connect-from-azure?tabs=azure-portal%2Clinux

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を参照してください