~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/process/maintainer-pgp-guide.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. _pgpguide:
  2 
  3 ===========================
  4 Kernel Maintainer PGP guide
  5 ===========================
  6 
  7 :Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
  8 
  9 This document is aimed at Linux kernel developers, and especially at
 10 subsystem maintainers. It contains a subset of information discussed in
 11 the more general "`Protecting Code Integrity`_" guide published by the
 12 Linux Foundation. Please read that document for more in-depth discussion
 13 on some of the topics mentioned in this guide.
 14 
 15 .. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md
 16 
 17 The role of PGP in Linux Kernel development
 18 ===========================================
 19 
 20 PGP helps ensure the integrity of the code that is produced by the Linux
 21 kernel development community and, to a lesser degree, establish trusted
 22 communication channels between developers via PGP-signed email exchange.
 23 
 24 The Linux kernel source code is available in two main formats:
 25 
 26 - Distributed source repositories (git)
 27 - Periodic release snapshots (tarballs)
 28 
 29 Both git repositories and tarballs carry PGP signatures of the kernel
 30 developers who create official kernel releases. These signatures offer a
 31 cryptographic guarantee that downloadable versions made available via
 32 kernel.org or any other mirrors are identical to what these developers
 33 have on their workstations. To this end:
 34 
 35 - git repositories provide PGP signatures on all tags
 36 - tarballs provide detached PGP signatures with all downloads
 37 
 38 .. _devs_not_infra:
 39 
 40 Trusting the developers, not infrastructure
 41 -------------------------------------------
 42 
 43 Ever since the 2011 compromise of core kernel.org systems, the main
 44 operating principle of the Kernel Archives project has been to assume
 45 that any part of the infrastructure can be compromised at any time. For
 46 this reason, the administrators have taken deliberate steps to emphasize
 47 that trust must always be placed with developers and never with the code
 48 hosting infrastructure, regardless of how good the security practices
 49 for the latter may be.
 50 
 51 The above guiding principle is the reason why this guide is needed. We
 52 want to make sure that by placing trust into developers we do not simply
 53 shift the blame for potential future security incidents to someone else.
 54 The goal is to provide a set of guidelines developers can use to create
 55 a secure working environment and safeguard the PGP keys used to
 56 establish the integrity of the Linux kernel itself.
 57 
 58 .. _pgp_tools:
 59 
 60 PGP tools
 61 =========
 62 
 63 Use GnuPG 2.2 or later
 64 ----------------------
 65 
 66 Your distro should already have GnuPG installed by default, you just
 67 need to verify that you are using a reasonably recent version of it.
 68 To check, run::
 69 
 70     $ gpg --version | head -n1
 71 
 72 If you have version 2.2 or above, then you are good to go. If you have a
 73 version that is prior than 2.2, then some commands from this guide may
 74 not work.
 75 
 76 Configure gpg-agent options
 77 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 78 
 79 The GnuPG agent is a helper tool that will start automatically whenever
 80 you use the ``gpg`` command and run in the background with the purpose
 81 of caching the private key passphrase. There are two options you should
 82 know in order to tweak when the passphrase should be expired from cache:
 83 
 84 - ``default-cache-ttl`` (seconds): If you use the same key again before
 85   the time-to-live expires, the countdown will reset for another period.
 86   The default is 600 (10 minutes).
 87 - ``max-cache-ttl`` (seconds): Regardless of how recently you've used
 88   the key since initial passphrase entry, if the maximum time-to-live
 89   countdown expires, you'll have to enter the passphrase again. The
 90   default is 30 minutes.
 91 
 92 If you find either of these defaults too short (or too long), you can
 93 edit your ``~/.gnupg/gpg-agent.conf`` file to set your own values::
 94 
 95     # set to 30 minutes for regular ttl, and 2 hours for max ttl
 96     default-cache-ttl 1800
 97     max-cache-ttl 7200
 98 
 99 .. note::
100 
101     It is no longer necessary to start gpg-agent manually at the
102     beginning of your shell session. You may want to check your rc files
103     to remove anything you had in place for older versions of GnuPG, as
104     it may not be doing the right thing any more.
105 
106 .. _protect_your_key:
107 
108 Protect your PGP key
109 ====================
110 
111 This guide assumes that you already have a PGP key that you use for Linux
112 kernel development purposes. If you do not yet have one, please see the
113 "`Protecting Code Integrity`_" document mentioned earlier for guidance
114 on how to create a new one.
115 
116 You should also make a new key if your current one is weaker than 2048
117 bits (RSA).
118 
119 Understanding PGP Subkeys
120 -------------------------
121 
122 A PGP key rarely consists of a single keypair -- usually it is a
123 collection of independent subkeys that can be used for different
124 purposes based on their capabilities, assigned at their creation time.
125 PGP defines four capabilities that a key can have:
126 
127 - **[S]** keys can be used for signing
128 - **[E]** keys can be used for encryption
129 - **[A]** keys can be used for authentication
130 - **[C]** keys can be used for certifying other keys
131 
132 The key with the **[C]** capability is often called the "master" key,
133 but this terminology is misleading because it implies that the Certify
134 key can be used in place of any of other subkey on the same chain (like
135 a physical "master key" can be used to open locks made for other keys).
136 Since this is not the case, this guide will refer to it as "the Certify
137 key" to avoid any ambiguity.
138 
139 It is critical to fully understand the following:
140 
141 1. All subkeys are fully independent from each other. If you lose a
142    private subkey, it cannot be restored or recreated from any other
143    private key on your chain.
144 2. With the exception of the Certify key, there can be multiple subkeys
145    with identical capabilities (e.g. you can have 2 valid encryption
146    subkeys, 3 valid signing subkeys, but only one valid certification
147    subkey). All subkeys are fully independent -- a message encrypted to
148    one **[E]** subkey cannot be decrypted with any other **[E]** subkey
149    you may also have.
150 3. A single subkey may have multiple capabilities (e.g. your **[C]** key
151    can also be your **[S]** key).
152 
153 The key carrying the **[C]** (certify) capability is the only key that
154 can be used to indicate relationship with other keys. Only the **[C]**
155 key can be used to:
156 
157 - add or revoke other keys (subkeys) with S/E/A capabilities
158 - add, change or revoke identities (uids) associated with the key
159 - add or change the expiration date on itself or any subkey
160 - sign other people's keys for web of trust purposes
161 
162 By default, GnuPG creates the following when generating new keys:
163 
164 - One subkey carrying both Certify and Sign capabilities (**[SC]**)
165 - A separate subkey with the Encryption capability (**[E]**)
166 
167 If you used the default parameters when generating your key, then that
168 is what you will have. You can verify by running ``gpg --list-secret-keys``,
169 for example::
170 
171     sec   ed25519 2022-12-20 [SC] [expires: 2024-12-19]
172           000000000000000000000000AAAABBBBCCCCDDDD
173     uid           [ultimate] Alice Dev <adev@kernel.org>
174     ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]
175 
176 The long line under the ``sec`` entry is your key fingerprint --
177 whenever you see ``[fpr]`` in the examples below, that 40-character
178 string is what it refers to.
179 
180 Ensure your passphrase is strong
181 --------------------------------
182 
183 GnuPG uses passphrases to encrypt your private keys before storing them on
184 disk. This way, even if your ``.gnupg`` directory is leaked or stolen in
185 its entirety, the attackers cannot use your private keys without first
186 obtaining the passphrase to decrypt them.
187 
188 It is absolutely essential that your private keys are protected by a
189 strong passphrase. To set it or change it, use::
190 
191     $ gpg --change-passphrase [fpr]
192 
193 Create a separate Signing subkey
194 --------------------------------
195 
196 Our goal is to protect your Certify key by moving it to offline media,
197 so if you only have a combined **[SC]** key, then you should create a
198 separate signing subkey::
199 
200     $ gpg --quick-addkey [fpr] ed25519 sign
201 
202 .. note:: ECC support in GnuPG
203 
204     Note, that if you intend to use a hardware token that does not
205     support ED25519 ECC keys, you should choose "nistp256" instead or
206     "ed25519." See the section below on recommended hardware devices.
207 
208 
209 Back up your Certify key for disaster recovery
210 ----------------------------------------------
211 
212 The more signatures you have on your PGP key from other developers, the
213 more reasons you have to create a backup version that lives on something
214 other than digital media, for disaster recovery reasons.
215 
216 The best way to create a printable hardcopy of your private key is by
217 using the ``paperkey`` software written for this very purpose. See ``man
218 paperkey`` for more details on the output format and its benefits over
219 other solutions. Paperkey should already be packaged for most
220 distributions.
221 
222 Run the following command to create a hardcopy backup of your private
223 key::
224 
225     $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
226 
227 Print out that file (or pipe the output straight to lpr), then take a
228 pen and write your passphrase on the margin of the paper. **This is
229 strongly recommended** because the key printout is still encrypted with
230 that passphrase, and if you ever change it you will not remember what it
231 used to be when you had created the backup -- *guaranteed*.
232 
233 Put the resulting printout and the hand-written passphrase into an envelope
234 and store in a secure and well-protected place, preferably away from your
235 home, such as your bank vault.
236 
237 .. note::
238 
239     Your printer is probably no longer a simple dumb device connected to
240     your parallel port, but since the output is still encrypted with
241     your passphrase, printing out even to "cloud-integrated" modern
242     printers should remain a relatively safe operation.
243 
244 Back up your whole GnuPG directory
245 ----------------------------------
246 
247 .. warning::
248 
249     **!!!Do not skip this step!!!**
250 
251 It is important to have a readily available backup of your PGP keys
252 should you need to recover them. This is different from the
253 disaster-level preparedness we did with ``paperkey``. You will also rely
254 on these external copies whenever you need to use your Certify key --
255 such as when making changes to your own key or signing other people's
256 keys after conferences and summits.
257 
258 Start by getting a small USB "thumb" drive (preferably two!) that you
259 will use for backup purposes. You will need to encrypt them using LUKS
260 -- refer to your distro's documentation on how to accomplish this.
261 
262 For the encryption passphrase, you can use the same one as on your
263 PGP key.
264 
265 Once the encryption process is over, re-insert the USB drive and make
266 sure it gets properly mounted. Copy your entire ``.gnupg`` directory
267 over to the encrypted storage::
268 
269     $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
270 
271 You should now test to make sure everything still works::
272 
273     $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
274 
275 If you don't get any errors, then you should be good to go. Unmount the
276 USB drive, distinctly label it so you don't blow it away next time you
277 need to use a random USB drive, and put in a safe place -- but not too
278 far away, because you'll need to use it every now and again for things
279 like editing identities, adding or revoking subkeys, or signing other
280 people's keys.
281 
282 Remove the Certify key from your homedir
283 ----------------------------------------
284 
285 The files in our home directory are not as well protected as we like to
286 think.  They can be leaked or stolen via many different means:
287 
288 - by accident when making quick homedir copies to set up a new workstation
289 - by systems administrator negligence or malice
290 - via poorly secured backups
291 - via malware in desktop apps (browsers, pdf viewers, etc)
292 - via coercion when crossing international borders
293 
294 Protecting your key with a good passphrase greatly helps reduce the risk
295 of any of the above, but passphrases can be discovered via keyloggers,
296 shoulder-surfing, or any number of other means. For this reason, the
297 recommended setup is to remove your Certify key from your home directory
298 and store it on offline storage.
299 
300 .. warning::
301 
302     Please see the previous section and make sure you have backed up
303     your GnuPG directory in its entirety. What we are about to do will
304     render your key useless if you do not have a usable backup!
305 
306 First, identify the keygrip of your Certify key::
307 
308     $ gpg --with-keygrip --list-key [fpr]
309 
310 The output will be something like this::
311 
312     pub   ed25519 2022-12-20 [SC] [expires: 2022-12-19]
313           000000000000000000000000AAAABBBBCCCCDDDD
314           Keygrip = 1111000000000000000000000000000000000000
315     uid           [ultimate] Alice Dev <adev@kernel.org>
316     sub   cv25519 2022-12-20 [E] [expires: 2022-12-19]
317           Keygrip = 2222000000000000000000000000000000000000
318     sub   ed25519 2022-12-20 [S]
319           Keygrip = 3333000000000000000000000000000000000000
320 
321 Find the keygrip entry that is beneath the ``pub`` line (right under the
322 Certify key fingerprint). This will correspond directly to a file in your
323 ``~/.gnupg`` directory::
324 
325     $ cd ~/.gnupg/private-keys-v1.d
326     $ ls
327     1111000000000000000000000000000000000000.key
328     2222000000000000000000000000000000000000.key
329     3333000000000000000000000000000000000000.key
330 
331 All you have to do is simply remove the .key file that corresponds to
332 the Certify key keygrip::
333 
334     $ cd ~/.gnupg/private-keys-v1.d
335     $ rm 1111000000000000000000000000000000000000.key
336 
337 Now, if you issue the ``--list-secret-keys`` command, it will show that
338 the Certify key is missing (the ``#`` indicates it is not available)::
339 
340     $ gpg --list-secret-keys
341     sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
342           000000000000000000000000AAAABBBBCCCCDDDD
343     uid           [ultimate] Alice Dev <adev@kernel.org>
344     ssb   cv25519 2022-12-20 [E] [expires: 2024-12-19]
345     ssb   ed25519 2022-12-20 [S]
346 
347 You should also remove any ``secring.gpg`` files in the ``~/.gnupg``
348 directory, which may be left over from previous versions of GnuPG.
349 
350 If you don't have the "private-keys-v1.d" directory
351 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
352 
353 If you do not have a ``~/.gnupg/private-keys-v1.d`` directory, then your
354 secret keys are still stored in the legacy ``secring.gpg`` file used by
355 GnuPG v1. Making any changes to your key, such as changing the
356 passphrase or adding a subkey, should automatically convert the old
357 ``secring.gpg`` format to use ``private-keys-v1.d`` instead.
358 
359 Once you get that done, make sure to delete the obsolete ``secring.gpg``
360 file, which still contains your private keys.
361 
362 .. _smartcards:
363 
364 Move the subkeys to a dedicated crypto device
365 =============================================
366 
367 Even though the Certify key is now safe from being leaked or stolen, the
368 subkeys are still in your home directory. Anyone who manages to get
369 their hands on those will be able to decrypt your communication or fake
370 your signatures (if they know the passphrase). Furthermore, each time a
371 GnuPG operation is performed, the keys are loaded into system memory and
372 can be stolen from there by sufficiently advanced malware (think
373 Meltdown and Spectre).
374 
375 The best way to completely protect your keys is to move them to a
376 specialized hardware device that is capable of smartcard operations.
377 
378 The benefits of smartcards
379 --------------------------
380 
381 A smartcard contains a cryptographic chip that is capable of storing
382 private keys and performing crypto operations directly on the card
383 itself. Because the key contents never leave the smartcard, the
384 operating system of the computer into which you plug in the hardware
385 device is not able to retrieve the private keys themselves. This is very
386 different from the encrypted USB storage device we used earlier for
387 backup purposes -- while that USB device is plugged in and mounted, the
388 operating system is able to access the private key contents.
389 
390 Using external encrypted USB media is not a substitute to having a
391 smartcard-capable device.
392 
393 Available smartcard devices
394 ---------------------------
395 
396 Unless all your laptops and workstations have smartcard readers, the
397 easiest is to get a specialized USB device that implements smartcard
398 functionality. There are several options available:
399 
400 - `Nitrokey Start`_: Open hardware and Free Software, based on FSI
401   Japan's `Gnuk`_. One of the few available commercial devices that
402   support ED25519 ECC keys, but offer fewest security features (such as
403   resistance to tampering or some side-channel attacks).
404 - `Nitrokey Pro 2`_: Similar to the Nitrokey Start, but more
405   tamper-resistant and offers more security features. Pro 2 supports ECC
406   cryptography (NISTP).
407 - `Yubikey 5`_: proprietary hardware and software, but cheaper than
408   Nitrokey Pro and comes available in the USB-C form that is more useful
409   with newer laptops. Offers additional security features such as FIDO
410   U2F, among others, and now finally supports NISTP and ED25519 ECC
411   keys.
412 
413 Your choice will depend on cost, shipping availability in your
414 geographical region, and open/proprietary hardware considerations.
415 
416 .. note::
417 
418     If you are listed in MAINTAINERS or have an account at kernel.org,
419     you `qualify for a free Nitrokey Start`_ courtesy of The Linux
420     Foundation.
421 
422 .. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
423 .. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nkpr2-nitrokey-pro-2-3
424 .. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/
425 .. _Gnuk: https://www.fsij.org/doc-gnuk/
426 .. _`qualify for a free Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html
427 
428 Configure your smartcard device
429 -------------------------------
430 
431 Your smartcard device should Just Work (TM) the moment you plug it into
432 any modern Linux workstation. You can verify it by running::
433 
434     $ gpg --card-status
435 
436 If you see full smartcard details, then you are good to go.
437 Unfortunately, troubleshooting all possible reasons why things may not
438 be working for you is way beyond the scope of this guide. If you are
439 having trouble getting the card to work with GnuPG, please seek help via
440 usual support channels.
441 
442 To configure your smartcard, you will need to use the GnuPG menu system, as
443 there are no convenient command-line switches::
444 
445     $ gpg --card-edit
446     [...omitted...]
447     gpg/card> admin
448     Admin commands are allowed
449     gpg/card> passwd
450 
451 You should set the user PIN (1), Admin PIN (3), and the Reset Code (4).
452 Please make sure to record and store these in a safe place -- especially
453 the Admin PIN and the Reset Code (which allows you to completely wipe
454 the smartcard). You so rarely need to use the Admin PIN, that you will
455 inevitably forget what it is if you do not record it.
456 
457 Getting back to the main card menu, you can also set other values (such
458 as name, sex, login data, etc), but it's not necessary and will
459 additionally leak information about your smartcard should you lose it.
460 
461 .. note::
462 
463     Despite having the name "PIN", neither the user PIN nor the admin
464     PIN on the card need to be numbers.
465 
466 .. warning::
467 
468     Some devices may require that you move the subkeys onto the device
469     before you can change the passphrase. Please check the documentation
470     provided by the device manufacturer.
471 
472 Move the subkeys to your smartcard
473 ----------------------------------
474 
475 Exit the card menu (using "q") and save all changes. Next, let's move
476 your subkeys onto the smartcard. You will need both your PGP key
477 passphrase and the admin PIN of the card for most operations::
478 
479     $ gpg --edit-key [fpr]
480 
481     Secret subkeys are available.
482 
483     pub  ed25519/AAAABBBBCCCCDDDD
484          created: 2022-12-20  expires: 2024-12-19  usage: SC
485          trust: ultimate      validity: ultimate
486     ssb  cv25519/1111222233334444
487          created: 2022-12-20  expires: never       usage: E
488     ssb  ed25519/5555666677778888
489          created: 2017-12-07  expires: never       usage: S
490     [ultimate] (1). Alice Dev <adev@kernel.org>
491 
492     gpg>
493 
494 Using ``--edit-key`` puts us into the menu mode again, and you will
495 notice that the key listing is a little different. From here on, all
496 commands are done from inside this menu mode, as indicated by ``gpg>``.
497 
498 First, let's select the key we'll be putting onto the card -- you do
499 this by typing ``key 1`` (it's the first one in the listing, the **[E]**
500 subkey)::
501 
502     gpg> key 1
503 
504 In the output, you should now see ``ssb*`` on the **[E]** key. The ``*``
505 indicates which key is currently "selected." It works as a *toggle*,
506 meaning that if you type ``key 1`` again, the ``*`` will disappear and
507 the key will not be selected any more.
508 
509 Now, let's move that key onto the smartcard::
510 
511     gpg> keytocard
512     Please select where to store the key:
513        (2) Encryption key
514     Your selection? 2
515 
516 Since it's our **[E]** key, it makes sense to put it into the Encryption
517 slot.  When you submit your selection, you will be prompted first for
518 your PGP key passphrase, and then for the admin PIN. If the command
519 returns without an error, your key has been moved.
520 
521 **Important**: Now type ``key 1`` again to unselect the first key, and
522 ``key 2`` to select the **[S]** key::
523 
524     gpg> key 1
525     gpg> key 2
526     gpg> keytocard
527     Please select where to store the key:
528        (1) Signature key
529        (3) Authentication key
530     Your selection? 1
531 
532 You can use the **[S]** key both for Signature and Authentication, but
533 we want to make sure it's in the Signature slot, so choose (1). Once
534 again, if your command returns without an error, then the operation was
535 successful::
536 
537     gpg> q
538     Save changes? (y/N) y
539 
540 Saving the changes will delete the keys you moved to the card from your
541 home directory (but it's okay, because we have them in our backups
542 should we need to do this again for a replacement smartcard).
543 
544 Verifying that the keys were moved
545 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
546 
547 If you perform ``--list-secret-keys`` now, you will see a subtle
548 difference in the output::
549 
550     $ gpg --list-secret-keys
551     sec#  ed25519 2022-12-20 [SC] [expires: 2024-12-19]
552           000000000000000000000000AAAABBBBCCCCDDDD
553     uid           [ultimate] Alice Dev <adev@kernel.org>
554     ssb>  cv25519 2022-12-20 [E] [expires: 2024-12-19]
555     ssb>  ed25519 2022-12-20 [S]
556 
557 The ``>`` in the ``ssb>`` output indicates that the subkey is only
558 available on the smartcard. If you go back into your secret keys
559 directory and look at the contents there, you will notice that the
560 ``.key`` files there have been replaced with stubs::
561 
562     $ cd ~/.gnupg/private-keys-v1.d
563     $ strings *.key | grep 'private-key'
564 
565 The output should contain ``shadowed-private-key`` to indicate that
566 these files are only stubs and the actual content is on the smartcard.
567 
568 Verifying that the smartcard is functioning
569 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
570 
571 To verify that the smartcard is working as intended, you can create a
572 signature::
573 
574     $ echo "Hello world" | gpg --clearsign > /tmp/test.asc
575     $ gpg --verify /tmp/test.asc
576 
577 This should ask for your smartcard PIN on your first command, and then
578 show "Good signature" after you run ``gpg --verify``.
579 
580 Congratulations, you have successfully made it extremely difficult to
581 steal your digital developer identity!
582 
583 Other common GnuPG operations
584 -----------------------------
585 
586 Here is a quick reference for some common operations you'll need to do
587 with your PGP key.
588 
589 Mounting your safe offline storage
590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
591 
592 You will need your Certify key for any of the operations below, so you
593 will first need to mount your backup offline storage and tell GnuPG to
594 use it::
595 
596     $ export GNUPGHOME=/media/disk/foo/gnupg-backup
597     $ gpg --list-secret-keys
598 
599 You want to make sure that you see ``sec`` and not ``sec#`` in the
600 output (the ``#`` means the key is not available and you're still using
601 your regular home directory location).
602 
603 Extending key expiration date
604 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
605 
606 The Certify key has the default expiration date of 2 years from the date
607 of creation. This is done both for security reasons and to make obsolete
608 keys eventually disappear from keyservers.
609 
610 To extend the expiration on your key by a year from current date, just
611 run::
612 
613     $ gpg --quick-set-expire [fpr] 1y
614 
615 You can also use a specific date if that is easier to remember (e.g.
616 your birthday, January 1st, or Canada Day)::
617 
618     $ gpg --quick-set-expire [fpr] 2025-07-01
619 
620 Remember to send the updated key back to keyservers::
621 
622     $ gpg --send-key [fpr]
623 
624 Updating your work directory after any changes
625 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
626 
627 After you make any changes to your key using the offline storage, you will
628 want to import these changes back into your regular working directory::
629 
630     $ gpg --export | gpg --homedir ~/.gnupg --import
631     $ unset GNUPGHOME
632 
633 Using gpg-agent over ssh
634 ~~~~~~~~~~~~~~~~~~~~~~~~
635 
636 You can forward your gpg-agent over ssh if you need to sign tags or
637 commits on a remote system. Please refer to the instructions provided
638 on the GnuPG wiki:
639 
640 - `Agent Forwarding over SSH`_
641 
642 It works more smoothly if you can modify the sshd server settings on the
643 remote end.
644 
645 .. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding
646 
647 .. _pgp_with_git:
648 
649 Using PGP with Git
650 ==================
651 
652 One of the core features of Git is its decentralized nature -- once a
653 repository is cloned to your system, you have full history of the
654 project, including all of its tags, commits and branches. However, with
655 hundreds of cloned repositories floating around, how does anyone verify
656 that their copy of linux.git has not been tampered with by a malicious
657 third party?
658 
659 Or what happens if a backdoor is discovered in the code and the "Author"
660 line in the commit says it was done by you, while you're pretty sure you
661 had `nothing to do with it`_?
662 
663 To address both of these issues, Git introduced PGP integration. Signed
664 tags prove the repository integrity by assuring that its contents are
665 exactly the same as on the workstation of the developer who created the
666 tag, while signed commits make it nearly impossible for someone to
667 impersonate you without having access to your PGP keys.
668 
669 .. _`nothing to do with it`: https://github.com/jayphelps/git-blame-someone-else
670 
671 Configure git to use your PGP key
672 ---------------------------------
673 
674 If you only have one secret key in your keyring, then you don't really
675 need to do anything extra, as it becomes your default key.  However, if
676 you happen to have multiple secret keys, you can tell git which key
677 should be used (``[fpr]`` is the fingerprint of your key)::
678 
679     $ git config --global user.signingKey [fpr]
680 
681 How to work with signed tags
682 ----------------------------
683 
684 To create a signed tag, simply pass the ``-s`` switch to the tag
685 command::
686 
687     $ git tag -s [tagname]
688 
689 Our recommendation is to always sign git tags, as this allows other
690 developers to ensure that the git repository they are pulling from has
691 not been maliciously altered.
692 
693 How to verify signed tags
694 ~~~~~~~~~~~~~~~~~~~~~~~~~
695 
696 To verify a signed tag, simply use the ``verify-tag`` command::
697 
698     $ git verify-tag [tagname]
699 
700 If you are pulling a tag from another fork of the project repository,
701 git should automatically verify the signature at the tip you're pulling
702 and show you the results during the merge operation::
703 
704     $ git pull [url] tags/sometag
705 
706 The merge message will contain something like this::
707 
708     Merge tag 'sometag' of [url]
709 
710     [Tag message]
711 
712     # gpg: Signature made [...]
713     # gpg: Good signature from [...]
714 
715 If you are verifying someone else's git tag, then you will need to
716 import their PGP key. Please refer to the
717 ":ref:`verify_identities`" section below.
718 
719 Configure git to always sign annotated tags
720 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
721 
722 Chances are, if you're creating an annotated tag, you'll want to sign
723 it. To force git to always sign annotated tags, you can set a global
724 configuration option::
725 
726     $ git config --global tag.forceSignAnnotated true
727 
728 How to work with signed commits
729 -------------------------------
730 
731 It is easy to create signed commits, but it is much more difficult to
732 use them in Linux kernel development, since it relies on patches sent to
733 the mailing list, and this workflow does not preserve PGP commit
734 signatures. Furthermore, when rebasing your repository to match
735 upstream, even your own PGP commit signatures will end up discarded. For
736 this reason, most kernel developers don't bother signing their commits
737 and will ignore signed commits in any external repositories that they
738 rely upon in their work.
739 
740 However, if you have your working git tree publicly available at some
741 git hosting service (kernel.org, infradead.org, ozlabs.org, or others),
742 then the recommendation is that you sign all your git commits even if
743 upstream developers do not directly benefit from this practice.
744 
745 We recommend this for the following reasons:
746 
747 1. Should there ever be a need to perform code forensics or track code
748    provenance, even externally maintained trees carrying PGP commit
749    signatures will be valuable for such purposes.
750 2. If you ever need to re-clone your local repository (for example,
751    after a disk failure), this lets you easily verify the repository
752    integrity before resuming your work.
753 3. If someone needs to cherry-pick your commits, this allows them to
754    quickly verify their integrity before applying them.
755 
756 Creating signed commits
757 ~~~~~~~~~~~~~~~~~~~~~~~
758 
759 To create a signed commit, you just need to pass the ``-S`` flag to the
760 ``git commit`` command (it's capital ``-S`` due to collision with
761 another flag)::
762 
763     $ git commit -S
764 
765 Configure git to always sign commits
766 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
767 
768 You can tell git to always sign commits::
769 
770     git config --global commit.gpgSign true
771 
772 .. note::
773 
774     Make sure you configure ``gpg-agent`` before you turn this on.
775 
776 .. _verify_identities:
777 
778 
779 How to work with signed patches
780 -------------------------------
781 
782 It is possible to use your PGP key to sign patches sent to kernel
783 developer mailing lists. Since existing email signature mechanisms
784 (PGP-Mime or PGP-inline) tend to cause problems with regular code
785 review tasks, you should use the tool kernel.org created for this
786 purpose that puts cryptographic attestation signatures into message
787 headers (a-la DKIM):
788 
789 - `Patatt Patch Attestation`_
790 
791 .. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/
792 
793 Installing and configuring patatt
794 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
795 
796 Patatt is packaged for many distributions already, so please check there
797 first. You can also install it from pypi using "``pip install patatt``".
798 
799 If you already have your PGP key configured with git (via the
800 ``user.signingKey`` configuration parameter), then patatt requires no
801 further configuration. You can start signing your patches by installing
802 the git-send-email hook in the repository you want::
803 
804     patatt install-hook
805 
806 Now any patches you send with ``git send-email`` will be automatically
807 signed with your cryptographic signature.
808 
809 Checking patatt signatures
810 ~~~~~~~~~~~~~~~~~~~~~~~~~~
811 
812 If you are using ``b4`` to retrieve and apply patches, then it will
813 automatically attempt to verify all DKIM and patatt signatures it
814 encounters, for example::
815 
816     $ b4 am 20220720205013.890942-1-broonie@kernel.org
817     [...]
818     Checking attestation on all messages, may take a moment...
819     ---
820       ✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers
821       ✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall
822       ✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls
823       ---
824       ✓ Signed: openpgp/broonie@kernel.org
825       ✓ Signed: DKIM/kernel.org
826 
827 .. note::
828 
829     Patatt and b4 are still in active development and you should check
830     the latest documentation for these projects for any new or updated
831     features.
832 
833 .. _kernel_identities:
834 
835 How to verify kernel developer identities
836 =========================================
837 
838 Signing tags and commits is easy, but how does one go about verifying
839 that the key used to sign something belongs to the actual kernel
840 developer and not to a malicious imposter?
841 
842 Configure auto-key-retrieval using WKD and DANE
843 -----------------------------------------------
844 
845 If you are not already someone with an extensive collection of other
846 developers' public keys, then you can jumpstart your keyring by relying
847 on key auto-discovery and auto-retrieval. GnuPG can piggyback on other
848 delegated trust technologies, namely DNSSEC and TLS, to get you going if
849 the prospect of starting your own Web of Trust from scratch is too
850 daunting.
851 
852 Add the following to your ``~/.gnupg/gpg.conf``::
853 
854     auto-key-locate wkd,dane,local
855     auto-key-retrieve
856 
857 DNS-Based Authentication of Named Entities ("DANE") is a method for
858 publishing public keys in DNS and securing them using DNSSEC signed
859 zones. Web Key Directory ("WKD") is the alternative method that uses
860 https lookups for the same purpose. When using either DANE or WKD for
861 looking up public keys, GnuPG will validate DNSSEC or TLS certificates,
862 respectively, before adding auto-retrieved public keys to your local
863 keyring.
864 
865 Kernel.org publishes the WKD for all developers who have kernel.org
866 accounts. Once you have the above changes in your ``gpg.conf``, you can
867 auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you
868 don't already have them)::
869 
870     $ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
871 
872 If you have a kernel.org account, then you should `add the kernel.org
873 UID to your key`_ to make WKD more useful to other kernel developers.
874 
875 .. _`add the kernel.org UID to your key`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key
876 
877 Web of Trust (WOT) vs. Trust on First Use (TOFU)
878 ------------------------------------------------
879 
880 PGP incorporates a trust delegation mechanism known as the "Web of
881 Trust." At its core, this is an attempt to replace the need for
882 centralized Certification Authorities of the HTTPS/TLS world. Instead of
883 various software makers dictating who should be your trusted certifying
884 entity, PGP leaves this responsibility to each user.
885 
886 Unfortunately, very few people understand how the Web of Trust works.
887 While it remains an important aspect of the OpenPGP specification,
888 recent versions of GnuPG (2.2 and above) have implemented an alternative
889 mechanism called "Trust on First Use" (TOFU). You can think of TOFU as
890 "the SSH-like approach to trust." With SSH, the first time you connect
891 to a remote system, its key fingerprint is recorded and remembered. If
892 the key changes in the future, the SSH client will alert you and refuse
893 to connect, forcing you to make a decision on whether you choose to
894 trust the changed key or not. Similarly, the first time you import
895 someone's PGP key, it is assumed to be valid. If at any point in the
896 future GnuPG comes across another key with the same identity, both the
897 previously imported key and the new key will be marked as invalid and
898 you will need to manually figure out which one to keep.
899 
900 We recommend that you use the combined TOFU+PGP trust model (which is
901 the new default in GnuPG v2). To set it, add (or modify) the
902 ``trust-model`` setting in ``~/.gnupg/gpg.conf``::
903 
904     trust-model tofu+pgp
905 
906 Using the kernel.org web of trust repository
907 --------------------------------------------
908 
909 Kernel.org maintains a git repository with developers' public keys as a
910 replacement for replicating keyserver networks that have gone mostly
911 dark in the past few years. The full documentation for how to set up
912 that repository as your source of public keys can be found here:
913 
914 - `Kernel developer PGP Keyring`_
915 
916 If you are a kernel developer, please consider submitting your key for
917 inclusion into that keyring.
918 
919 .. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php