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