Bug 1658004 [wpt PR 24923] - [EventTiming] Improve some of the flaky tests, a=testonly
[gecko.git] / taskcluster / docs / signing.rst
blobeb0cecf1f8ab5aa671a3ab1dae518a7c00869785
1 Signing
2 =======
4 Overview
5 --------
7 Our `code signing`_ happens in discrete tasks, for both performance reasons
8 and to limit which machines have access to the signing servers and keys.
10 In general, the binary-to-be-signed is generated in one task, and the request
11 to sign it is in a second task. We verify the request via the `chain of trust`_,
12 sign the binary, then upload the signed binary or original binary + detached
13 signature as artifacts.
15 How the Task Works
16 ------------------
18 Scriptworker_ verifies the task definition and the upstream tasks until it
19 determines the graph comes from a trusted tree; this is `chain of trust`_
20 verification. Part of this verification is downloading and verifying the shas
21 of the ``upstreamArtifacts`` in the task payload.
23 An example signing task payload:
27   {
28     "payload": {
29       "upstreamArtifacts": [{
30         "paths": ["public/build/target.dmg"],
31         "formats": ["macapp"],
32         "taskId": "abcde",
33         "taskType": "build"
34       }, {
35         "paths": ["public/build/target.tar.gz"],
36         "formats": ["autograph_gpg"],
37         "taskId": "12345",
38         "taskType": "build"
39       }]
40     }
41   }
43 In the above example, scriptworker would download the ``target.dmg`` from task
44 ``abcde`` and ``target.tar.gz`` from task ``12345`` and verify their shas and
45 task definitions via `chain of trust`_ verification. Then it will launch
46 `signingscript`_, which requests a signing token from the signing server pool.
48 Signingscript determines it wants to sign ``target.dmg`` with the ``macapp``
49 format, and ``target.tar.gz`` with the ``autograph_gpg`` format. Each of the
50 `signing formats`_ has their own behavior. After performing any format-specific
51 checks or optimizations, it calls `signtool`_ to submit the file to the signing
52 servers and poll them for signed output. Once it downloads all of the signed
53 output files, it exits and scriptworker uploads the signed binaries.
55 We can specify multiple paths from a single task for a given set of formats,
56 and multiple formats for a given set of paths.
58 Signing kinds
59 -------------
61 We currently have 12 different signing kinds. These fall into several categories:
63 **Build internal signing**: Certain package types require the internals to be signed.
64 For certain package types, e.g. exe or dmg, we extract the internal binaries
65 (e.g. xul.dll) and sign them. This is true for certain zipfiles, exes, and dmgs;
66 we need to sign the internals before we [re]create the package. For linux
67 tarballs, we don't need special packaging, so we can sign everything in this
68 task. These kinds include `build-signing`, `shippable-l10n-signing`,
69 `release-eme-free-repack-signing`, and `release-partner-repack-signing`.
71 **Build repackage signing**: Once we take the signed internals and package them
72 (known as a `repackage`), certain formats require a signed external package.
73 If we have created an update MAR file from the signed internals, the MAR
74 file will also need to be signed. These kinds include `repackage-signing`,
75 `release-eme-free-repack-repackage-signing`, and `release-partner-repack-repackage-signing`.
77 `release-source-signing` and `partials-signing` sign the release source tarball
78 and partial update MARs.
80 We generate signed checksums at the top of the releases directories, like
81 in `60.0`_. To generate these, we have the checksums signing kinds, including
82 `release-generate-checksums-signing`, `checksums-signing`, and
83 `release-source-checksums-signing`
85 .. _signing formats:
87 Signing formats
88 ---------------
90 The known signingscript formats are listed in the fourth column of the
91 `signing password files`_.
93 The formats are specified in the ``upstreamArtifacts`` list-of-dicts.
94 ``autograph_gpg`` signing results in a detached ``.asc`` signature file. Because of its
95 nature, we gpg-sign at the end if given multiple formats for a given set of
96 files.
98 ``jar`` signing is Android apk signing. After signing, we ``zipalign`` the apk.
99 This includes the ``focus-jar`` format, which is just a way to specify a different
100 set of keys for the Focus app.
102 ``macapp`` signing accepts either a ``dmg`` or ``tar.gz``; it converts ``dmg``
103 files to ``tar.gz`` before submitting to the signing server. The signed binary
104 is a ``tar.gz``.
106 ``authenticode`` signing takes individual binaries or a zipfile. We sign the
107 individual file or internals of the zipfile, skipping any already-signed files
108 and a select few blocklisted files (using the `should_sign_windows`_ function).
109 It returns a signed individual binary or zipfile with signed internals, depending
110 on the input. This format includes ``autograph_authenticode``, and
111 ``autograph_authenticode_stub``.
113 ``mar`` signing signs our update files (Mozilla ARchive). ``mar_sha384`` is
114 the same, but with a different hashing algorithm.
116 ``autograph_widevine`` is also video-related; see the
117 `widevine site`_. We sign specific files inside the package and rebuild the
118 ``precomplete`` file that we use for updates.
120 Cert levels
121 -----------
123 Cert levels are how we separate signing privileges. We have the following levels:
125 ``dep`` is short for ``depend``, which is a term from the Netscape days. (This
126 refers to builds that don't clobber, so they keep their dependency object files
127 cached from the previous build.) These certs and keys are designed to be used
128 for Try or on-push builds that we don't intend to ship. Many of these are
129 self-signed and not of high security value; they're intended for testing
130 purposes.
132 ``nightly`` refers to the Nightly product and channel. We use these keys for
133 signing and shipping nightly builds, as well as Devedition on the beta channel.
134 Because these are shipping keys, they are restricted; only a subset of branches
135 can request the use of these keys.
137 ``release`` refers to our releases, off the beta, release, or esr channels.
138 These are the most restricted keys.
140 We request a certain cert level via scopes:
141 ``project:releng:signing:cert:dep-signing``,
142 ``project:releng:signing:cert:nightly-signing``, or
143 ``project:releng:signing:cert:release-signing``. Each signing task is required
144 to have exactly one of those scopes, and only nightly- and release-enabled
145 branches are able to use the latter two scopes. If a task is scheduled with one
146 of those restricted scopes on a non-allowlisted branch, Chain of Trust
147 verification will raise an exception.
149 Signing scriptworker workerTypes
150 --------------------------------
152 The `depsigning`_ pool handles all of the dep signing. These are heavily in use
153 on try and autoland, but also other branches. These verify
154 the `chain of trust` artifact but not its signature, and they don't have a
155 gpg key to sign their own chain of trust artifact. This is by design; the chain
156 of trust should and will break if a production scriptworker is downstream from
157 a depsigning worker.
159 The `signing-linux-v1`_ pool is the production signing pool; it handles the
160 nightly- and release- signing requests. As such, it verifies the upstream
161 chain of trust and all signatures, and signs its chain of trust artifact.
163 The `signing-linux-dev`_ pool is intended for signingscript and scriptworker
164 development use. Because it isn't used on any Firefox-developer-facing branch,
165 Mozilla Releng is able to make breaking changes on this pool without affecting
166 any other team.
168 .. _60.0: https://archive.mozilla.org/pub/firefox/releases/60.0/
169 .. _addonscript: https://github.com/mozilla-releng/addonscript/
170 .. _code signing: https://en.wikipedia.org/wiki/Code_signing
171 .. _chain of trust: https://scriptworker.readthedocs.io/en/latest/chain_of_trust.html
172 .. _depsigning: https://firefox-ci-tc.services.mozilla.com/provisioners/scriptworker-k8s/worker-types/gecko-t-signing
173 .. _should_sign_windows: https://github.com/mozilla-releng/signingscript/blob/65cbb99ea53896fda9f4844e050a9695c762d24f/signingscript/sign.py#L369
174 .. _Encrypted Media Extensions: https://hacks.mozilla.org/2014/05/reconciling-mozillas-mission-and-w3c-eme/
175 .. _signing password files: https://github.com/mozilla/build-puppet/tree/feff5e12ab70f2c060b29940464e77208c7f0ef2/modules/signing_scriptworker/templates
176 .. _signingscript: https://github.com/mozilla-releng/signingscript/
177 .. _signing-linux-dev: https://firefox-ci-tc.services.mozilla.com/provisioners/scriptworker-k8s/worker-types/gecko-t-signing-dev
178 .. _signing-linux-v1: https://firefox-ci-tc.services.mozilla.com/provisioners/scriptworker-k8s/worker-types/gecko-3-signing
179 .. _signtool: https://github.com/mozilla-releng/signtool
180 .. _Scriptworker: https://github.com/mozilla-releng/scriptworker/
181 .. _widevine site: https://www.widevine.com/wv_drm.html