@@ -6,33 +6,83 @@ parameters:
66 ExtractDir : ' '
77 SigningCertificate : ' '
88 ExportCommand : ' '
9+ ExportLegacyCommand : ' '
910 ContinueOnError : false
11+ InstallTool : true
12+ InstallLegacyTool : false
1013 AzureServiceConnectionName : ' Python Signing'
1114
1215steps :
13- - ${{ if parameters.SigningCertificate }} :
14- - powershell : |
15- # Install sign tool
16- dotnet tool install --global --prerelease sign
17- $signtool = (gcm sign -EA SilentlyContinue).Source
18- if (-not $signtool) {
19- $signtool = (gi "${env:USERPROFILE}\.dotnet\tools\sign.exe").FullName
20- }
21- $signargs = 'code trusted-signing -v Information ' + `
22- '-fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ' + `
23- '-tse "$(TrustedSigningUri)" -tsa "$(TrustedSigningAccount)" -tscp "$(TrustedSigningCertificateName)" ' + `
24- '-d "$(SigningDescription)" '
16+ - ${{ if and(parameters.SigningCertificate, ne(parameters.SigningCertificate, 'Unsigned')) }} :
17+ - ${{ if eq(parameters.InstallTool, 'true') }} :
18+ - powershell : |
19+ # Install sign tool
20+ dotnet tool install --global --prerelease sign
21+ $signtool = (gcm sign -EA SilentlyContinue).Source
22+ if (-not $signtool) {
23+ $signtool = (gi "${env:USERPROFILE}\.dotnet\tools\sign.exe").FullName
24+ }
25+ $signargs = 'code artifact-signing -v Information ' + `
26+ '-fd sha256 -t http://timestamp.acs.microsoft.com -td sha256 ' + `
27+ "-tse ""${env:TSE}"" -tsa ""${env:TSA}"" -tscp ""${env:TSCP}"" -d ""${env:DESCRIPTION}"""
28+
29+ Write-Host "##vso[task.setvariable variable=__TrustedSigningCmd]$signtool"
30+ Write-Host "##vso[task.setvariable variable=__TrustedSigningArgs]$signargs"
31+ if ($env:EXPORT_COMMAND) {
32+ $signcmd = """$signtool"" $signargs"
33+ Write-Host "##vso[task.setvariable variable=${env:EXPORT_COMMAND}]$signcmd"
34+ }
35+ workingDirectory: $(Build.BinariesDirectory)
36+ displayName: 'Install Azure Artifact Signing tools'
37+ env:
38+ TSE: $(TrustedSigningUri)
39+ TSA: $(TrustedSigningAccount)
40+ TSCP: $(TrustedSigningCertificateName)
41+ DESCRIPTION: $(SigningDescription)
42+ EXPORT_COMMAND: ${{ parameters.ExportCommand }}
43+
44+ - ${{ if eq(parameters.InstallLegacyTool, 'true') }} :
45+ - powershell : |
46+ git clone https://github.com/python/cpython-bin-deps --revision fb06137dccc43ed5b030cdd9e3560990b37f39da --depth 1 --progress -v "signtool"
47+
48+ $signtool = gi signtool\x64\signtool.exe
49+ $dlib = gi signtool\azure_trusted_signing\x64\Azure.CodeSigning.Dlib.dll
50+ Write-Host "##vso[task.setvariable variable=MAKECAT]$(gi signtool\x64\makecat.exe)"
51+
52+ ConvertTo-Json @{
53+ Endpoint=$env:TSE;
54+ CodeSigningAccountName=$env:TSA;
55+ CertificateProfileName=$env:TSCP;
56+ # Only allow Azure CLI credentials and environment credentials
57+ ExcludeCredentials=@(
58+ "ManagedIdentityCredential",
59+ "WorkloadIdentityCredential",
60+ "SharedTokenCacheCredential",
61+ "VisualStudioCredential",
62+ "VisualStudioCodeCredential",
63+ "AzurePowerShellCredential",
64+ "AzureDeveloperCliCredential",
65+ "InteractiveBrowserCredential"
66+ );
67+ } | Out-File signtool\metadata.json -Encoding ascii
68+ Write-Host "##vso[task.setvariable variable=SIGNTOOL_METADATA]$(gi signtool\metadata.json)"
2569
26- Write-Host "##vso[task.setvariable variable=__TrustedSigningCmd]$signtool"
27- Write-Host "##vso[task.setvariable variable=__TrustedSigningArgs]$signargs"
28- if ($env:EXPORT_COMMAND) {
29- $signcmd = """$signtool"" $signargs"
30- Write-Host "##vso[task.setvariable variable=${env:EXPORT_COMMAND}]$signcmd"
31- }
32- workingDirectory: $(Build.BinariesDirectory)
33- displayName: 'Install Trusted Signing tools'
34- env:
35- EXPORT_COMMAND: ${{ parameters.ExportCommand }}
70+ $signargs = 'sign /v /fd sha256 /tr http://timestamp.acs.microsoft.com /td SHA256' + `
71+ "/dlib ""$dlib"" /dmdf ""$(gi signtool\metadata.json)"""
72+ Write-Host "##vso[task.setvariable variable=__TrustedSigningCmd]$signtool"
73+ Write-Host "##vso[task.setvariable variable=__TrustedSigningArgs]$signargs"
74+
75+ if ($env:EXPORT_COMMAND) {
76+ $signcmd = """$signtool"" $signargs"
77+ Write-Host "##vso[task.setvariable variable=${env:EXPORT_COMMAND}]$signcmd"
78+ }
79+ workingDirectory: $(Pipeline.Workspace)
80+ displayName: 'Download signtool binaries'
81+ env:
82+ TSE: $(TrustedSigningUri)
83+ TSA: $(TrustedSigningAccount)
84+ TSCP: $(TrustedSigningCertificateName)
85+ EXPORT_COMMAND: ${{ parameters.ExportLegacyCommand }}
3686
3787 - ${{ if parameters.AzureServiceConnectionName }} :
3888 # We sign in once with the AzureCLI task, as it uses OIDC to obtain a
@@ -45,25 +95,25 @@ steps:
4595 scriptType : ' ps'
4696 scriptLocation : ' inlineScript'
4797 inlineScript : |
48- "##vso[task.setvariable variable=AZURE_CLIENT_ID ;issecret=true]${env:servicePrincipalId}"
49- "##vso[task.setvariable variable=AZURE_ID_TOKEN ;issecret=true]${env:idToken}"
50- "##vso[task.setvariable variable=AZURE_TENANT_ID ;issecret=true]${env:tenantId}"
98+ "##vso[task.setvariable variable=__AZURE_CLIENT_ID ;issecret=true]${env:servicePrincipalId}"
99+ "##vso[task.setvariable variable=__AZURE_ID_TOKEN ;issecret=true]${env:idToken}"
100+ "##vso[task.setvariable variable=__AZURE_TENANT_ID ;issecret=true]${env:tenantId}"
51101 addSpnToEnvironment : true
52102
53103 - powershell : >
54104 az login --service-principal
55- -u $(AZURE_CLIENT_ID )
56- --tenant $(AZURE_TENANT_ID )
105+ -u $(__AZURE_CLIENT_ID )
106+ --tenant $(__AZURE_TENANT_ID )
57107 --allow-no-subscriptions
58- --federated-token $(AZURE_ID_TOKEN )
108+ --federated-token $(__AZURE_ID_TOKEN )
59109 displayName: 'Authenticate signing tools (2/2)'
60110
61111 - ${{ if parameters.Include }} :
62112 - powershell : |
63- if ("${{ parameters.Exclude }}" ) {
64- $files = (dir ${{ parameters.Include }} -Exclude ${{ parameters.Exclude }} -File)
113+ if ($env:EXCLUDE ) {
114+ $files = (dir $env:INCLUDE -Exclude $env:EXCLUDE -File)
65115 } else {
66- $files = (dir ${{ parameters.Include }} -File)
116+ $files = (dir $env:INCLUDE -File)
67117 }
68118 if ($env:FILTER) {
69119 ($env:FILTER -split ';') -join "`n" | Out-File __filelist.txt -Encoding utf8
@@ -82,31 +132,37 @@ steps:
82132 continueOnError: true
83133 workingDirectory: ${{ parameters.WorkingDir }}
84134 env:
135+ INCLUDE: ${{ parameters.Include }}
136+ EXCLUDE: ${{ parameters.Exclude }}
85137 TRUSTED_SIGNING_CMD: $(__TrustedSigningCmd)
86138 TRUSTED_SIGNING_ARGS: $(__TrustedSigningArgs)
87139 ${{ if parameters.Filter }}:
88140 FILTER: ${{ parameters.Filter }}
89141
90142
91- - ${{ if parameters.ExtractDir }} :
92- - powershell : |
93- if ("${{ parameters.Exclude }}" ) {
94- $files = (dir ${{ parameters.Include }} -Exclude ${{ parameters.Exclude }} -File)
95- } else {
96- $files = (dir ${{ parameters.Include }} -File)
97- }
98- $c = $files | %{ (Get-AuthenticodeSignature $_).SignerCertificate } | ?{ $_ -ne $null } | select -First 1
99- if (-not $c) {
100- Write-Host "Failed to find certificate for ${{ parameters.SigningCertificate }}"
101- exit
102- }
143+ - ${{ if parameters.ExtractDir }} :
144+ - powershell : |
145+ if ($env:EXCLUDE ) {
146+ $files = (dir $env:INCLUDE -Exclude $env:EXCLUDE -File)
147+ } else {
148+ $files = (dir $env:INCLUDE -File)
149+ }
150+ $c = $files | %{ (Get-AuthenticodeSignature $_).SignerCertificate } | ?{ $_ -ne $null } | select -First 1
151+ if (-not $c) {
152+ Write-Host "Failed to find certificate for ${{ parameters.SigningCertificate }}"
153+ exit
154+ }
103155
104- $d = mkdir "${{ parameters.ExtractDir }}" -Force
105- $cf = "$d\cert.cer"
106- [IO.File]::WriteAllBytes($cf, $c.RawData)
107- $csha = (Get-FileHash $cf -Algorithm SHA256).Hash.ToLower()
156+ $d = mkdir $env:EXTRACT_DIR -Force
157+ $cf = "$d\cert.cer"
158+ [IO.File]::WriteAllBytes($cf, $c.RawData)
159+ $csha = (Get-FileHash $cf -Algorithm SHA256).Hash.ToLower()
108160
109- $info = @{ Subject=$c.Subject; SHA256=$csha; }
110- $info | ConvertTo-JSON -Compress | Out-File -Encoding utf8 "$d\certinfo.json"
111- displayName: "Extract certificate info"
112- workingDirectory: ${{ parameters.WorkingDir }}
161+ $info = @{ Subject=$c.Subject; SHA256=$csha; }
162+ $info | ConvertTo-JSON -Compress | Out-File -Encoding utf8 "$d\certinfo.json"
163+ displayName: "Extract certificate info"
164+ workingDirectory: ${{ parameters.WorkingDir }}
165+ env:
166+ INCLUDE: ${{ parameters.Include }}
167+ EXCLUDE: ${{ parameters.Exclude }}
168+ EXTRACT_DIR: ${{ parameters.ExtractDir }}
0 commit comments