Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/desktop-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,6 @@ jobs:
runs-on: windows-2025
environment: windows-signing
env:
MAPLE_WINDOWS_AUTHENTICODE_SUBJECT: ${{ secrets.AZURE_ARTIFACT_SIGNING_EXPECTED_SUBJECT }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_ENDPOINT: ${{ secrets.AZURE_ARTIFACT_SIGNING_ENDPOINT }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_ACCOUNT_NAME: ${{ secrets.AZURE_ARTIFACT_SIGNING_ACCOUNT_NAME }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME: ${{ secrets.AZURE_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME }}
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,6 @@ jobs:
runs-on: windows-2025
environment: windows-signing
env:
MAPLE_WINDOWS_AUTHENTICODE_SUBJECT: ${{ secrets.AZURE_ARTIFACT_SIGNING_EXPECTED_SUBJECT }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_ENDPOINT: ${{ secrets.AZURE_ARTIFACT_SIGNING_ENDPOINT }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_ACCOUNT_NAME: ${{ secrets.AZURE_ARTIFACT_SIGNING_ACCOUNT_NAME }}
MAPLE_WINDOWS_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME: ${{ secrets.AZURE_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME }}
Expand Down
31 changes: 21 additions & 10 deletions scripts/ci/_common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3634,8 +3634,8 @@ verify_windows_authenticode_signatures() {
return 1
fi

if [ -z "${MAPLE_WINDOWS_AUTHENTICODE_SUBJECT:-}" ]; then
echo "MAPLE_WINDOWS_AUTHENTICODE_SUBJECT is required to verify the Windows signer identity." >&2
if [ -z "${MAPLE_WINDOWS_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME:-}" ]; then
echo "MAPLE_WINDOWS_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME is required to verify the Windows signer identity." >&2
return 1
fi

Expand All @@ -3651,16 +3651,23 @@ verify_windows_authenticode_signatures() {
printf '%s\n' "$(to_windows_path "${file}")" >> "${files_manifest}"
done

# Keep the expected subject and file list in the environment. Passing them as
# positional args through Git Bash into pwsh can split values that contain spaces.
# Keep the expected identity fields and file list in the environment. Passing
# them as positional args through Git Bash into pwsh can split values that
# contain spaces. The issuer default is Microsoft Trusted Signing's current
# ID-verified code-signing CA; override it if Microsoft rotates the CA.
# shellcheck disable=SC2016
if ! MAPLE_WINDOWS_AUTHENTICODE_FILES="$(to_windows_path "${files_manifest}")" \
MAPLE_WINDOWS_AUTHENTICODE_SUBJECT="${MAPLE_WINDOWS_AUTHENTICODE_SUBJECT}" \
MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_CN="${MAPLE_WINDOWS_ARTIFACT_SIGNING_CERTIFICATE_PROFILE_NAME}" \
MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER="${MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER:-CN=Microsoft ID Verified CS AOC CA 03, O=Microsoft Corporation, C=US}" \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Hardcoded issuer default couples verification to a specific Microsoft CA

The default value for MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER is hardcoded at scripts/ci/_common.sh:3660 as CN=Microsoft ID Verified CS AOC CA 03, O=Microsoft Corporation, C=US. If Microsoft rotates or renames this intermediate CA (e.g., bumps from CA 03 to CA 04), the verification will fail without any code change. The environment variable override (${MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER:-...}) provides an escape hatch, but since it's not configured in any workflow file, a CA rotation would require either a code change or adding a new secret/env var. This is worth noting in documentation or a comment, though it is not a bug.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

pwsh -NoLogo -NoProfile -ExecutionPolicy Bypass -Command '
$ErrorActionPreference = "Stop"
$expectedSubject = $env:MAPLE_WINDOWS_AUTHENTICODE_SUBJECT
if ([string]::IsNullOrWhiteSpace($expectedSubject)) {
throw "MAPLE_WINDOWS_AUTHENTICODE_SUBJECT is required to verify the Windows signer identity."
$expectedCn = $env:MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_CN
if ([string]::IsNullOrWhiteSpace($expectedCn)) {
throw "MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_CN is required to verify the Windows signer identity."
}
$expectedIssuer = $env:MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER
if ([string]::IsNullOrWhiteSpace($expectedIssuer)) {
throw "MAPLE_WINDOWS_AUTHENTICODE_EXPECTED_ISSUER is required to verify the Windows signer identity."
}
$filesManifest = $env:MAPLE_WINDOWS_AUTHENTICODE_FILES
if ([string]::IsNullOrWhiteSpace($filesManifest)) {
Expand All @@ -3681,8 +3688,12 @@ verify_windows_authenticode_signatures() {
$subject = $signature.SignerCertificate.Subject
$issuer = $signature.SignerCertificate.Issuer
}
if ($subject -ne $expectedSubject) {
throw "Authenticode signer subject mismatch for $file. Actual=$subject Issuer=$issuer"
if ($issuer -ne $expectedIssuer) {
throw "Authenticode signer issuer mismatch for $file. ActualIssuer=$issuer Subject=$subject"
}
$expectedCnPattern = "(^|,\s*)CN=$([regex]::Escape($expectedCn))(\s*,|$)"
if (-not [regex]::IsMatch($subject, $expectedCnPattern)) {
throw "Authenticode signer subject CN mismatch for $file. Actual=$subject Issuer=$issuer"
}
Write-Output ("verified-windows-authenticode {0} thumbprint={1}" -f $file, $signature.SignerCertificate.Thumbprint)
}
Expand Down
Loading