@@ -100,6 +100,45 @@ jobs:
100100 - name : " Install cargo extensions"
101101 shell : bash
102102 run : scripts/install-cargo-extensions.sh
103+ - name : " Prepare macOS signing certificate"
104+ run : |
105+ set -euo pipefail
106+
107+ CERT_NAME="uv-codesign-ci"
108+ CERT_DIR="$RUNNER_TEMP/codesign-cert"
109+ mkdir -p "$CERT_DIR"
110+
111+ openssl req -x509 -newkey rsa:2048 -sha256 -days 7 -nodes \
112+ -keyout "$CERT_DIR/key.pem" \
113+ -out "$CERT_DIR/cert.pem" \
114+ -subj "/CN=$CERT_NAME" \
115+ -addext "extendedKeyUsage=codeSigning" \
116+ -addext "keyUsage=digitalSignature"
117+
118+ P12_PASSWORD="$(uuidgen | tr -d '-')"
119+
120+ # LibreSSL (shipped with macOS) doesn't support -legacy; OpenSSL 3.x
121+ # requires it for macOS keychain compatibility.
122+ LEGACY_FLAG=""
123+ if openssl version 2>&1 | grep -q "^OpenSSL 3"; then
124+ LEGACY_FLAG="-legacy"
125+ fi
126+
127+ openssl pkcs12 -export $LEGACY_FLAG \
128+ -inkey "$CERT_DIR/key.pem" \
129+ -in "$CERT_DIR/cert.pem" \
130+ -name "$CERT_NAME" \
131+ -out "$CERT_DIR/cert.p12" \
132+ -passout pass:"$P12_PASSWORD"
133+
134+ CERT_B64="$(base64 < "$CERT_DIR/cert.p12" | tr -d '\n')"
135+ CERT_SHA1="$(openssl x509 -in "$CERT_DIR/cert.pem" -noout -fingerprint -sha1 | cut -d= -f2 | tr -d ':')"
136+
137+ {
138+ echo "CODESIGN_IDENTITY=$CERT_SHA1"
139+ echo "CODESIGN_CERTIFICATE=$CERT_B64"
140+ echo "CODESIGN_CERTIFICATE_PASSWORD=$P12_PASSWORD"
141+ } >> "$GITHUB_ENV"
103142
104143 # uv
105144 - name : " Build wheels - x86_64"
@@ -166,6 +205,45 @@ jobs:
166205 - name : " Install cargo extensions"
167206 shell : bash
168207 run : scripts/install-cargo-extensions.sh
208+ - name : " Prepare macOS signing certificate"
209+ run : |
210+ set -euo pipefail
211+
212+ CERT_NAME="uv-codesign-ci"
213+ CERT_DIR="$RUNNER_TEMP/codesign-cert"
214+ mkdir -p "$CERT_DIR"
215+
216+ openssl req -x509 -newkey rsa:2048 -sha256 -days 7 -nodes \
217+ -keyout "$CERT_DIR/key.pem" \
218+ -out "$CERT_DIR/cert.pem" \
219+ -subj "/CN=$CERT_NAME" \
220+ -addext "extendedKeyUsage=codeSigning" \
221+ -addext "keyUsage=digitalSignature"
222+
223+ P12_PASSWORD="$(uuidgen | tr -d '-')"
224+
225+ # LibreSSL (shipped with macOS) doesn't support -legacy; OpenSSL 3.x
226+ # requires it for macOS keychain compatibility.
227+ LEGACY_FLAG=""
228+ if openssl version 2>&1 | grep -q "^OpenSSL 3"; then
229+ LEGACY_FLAG="-legacy"
230+ fi
231+
232+ openssl pkcs12 -export $LEGACY_FLAG \
233+ -inkey "$CERT_DIR/key.pem" \
234+ -in "$CERT_DIR/cert.pem" \
235+ -name "$CERT_NAME" \
236+ -out "$CERT_DIR/cert.p12" \
237+ -passout pass:"$P12_PASSWORD"
238+
239+ CERT_B64="$(base64 < "$CERT_DIR/cert.p12" | tr -d '\n')"
240+ CERT_SHA1="$(openssl x509 -in "$CERT_DIR/cert.pem" -noout -fingerprint -sha1 | cut -d= -f2 | tr -d ':')"
241+
242+ {
243+ echo "CODESIGN_IDENTITY=$CERT_SHA1"
244+ echo "CODESIGN_CERTIFICATE=$CERT_B64"
245+ echo "CODESIGN_CERTIFICATE_PASSWORD=$P12_PASSWORD"
246+ } >> "$GITHUB_ENV"
169247
170248 # uv
171249 - name : " Build wheels - aarch64"
@@ -256,6 +334,25 @@ jobs:
256334 - name : " Install cargo extensions"
257335 shell : bash
258336 run : scripts/install-cargo-extensions.sh
337+ - name : " Prepare Windows signing certificate"
338+ shell : pwsh
339+ run : |
340+ $cert = New-SelfSignedCertificate `
341+ -Type CodeSigningCert `
342+ -Subject "CN=uv-codesign-ci" `
343+ -CertStoreLocation "Cert:\CurrentUser\My" `
344+ -NotAfter (Get-Date).AddDays(7)
345+ $passwordPlain = [Guid]::NewGuid().ToString("N")
346+ $password = ConvertTo-SecureString -String $passwordPlain -Force -AsPlainText
347+ $pfxPath = Join-Path $env:RUNNER_TEMP "uv-codesign-ci.pfx"
348+
349+ Export-PfxCertificate `
350+ -Cert "Cert:\CurrentUser\My\$($cert.Thumbprint)" `
351+ -FilePath $pfxPath `
352+ -Password $password | Out-Null
353+
354+ "SIGNTOOL_CERTIFICATE_PATH=$pfxPath" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
355+ "SIGNTOOL_CERTIFICATE_PASSWORD=$passwordPlain" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
259356
260357 # uv
261358 - name : " Build wheels"
0 commit comments