@fredlackey/devutils 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +5 -5
  2. package/package.json +1 -1
  3. package/src/commands/install.js +374 -36
  4. package/src/installs/adobe-creative-cloud.js +527 -25
  5. package/src/installs/adobe-creative-cloud.md +605 -0
  6. package/src/installs/appcleaner.js +303 -26
  7. package/src/installs/appcleaner.md +699 -0
  8. package/src/installs/apt-transport-https.js +390 -0
  9. package/src/installs/apt-transport-https.md +678 -0
  10. package/src/installs/atomicparsley.js +624 -26
  11. package/src/installs/atomicparsley.md +795 -0
  12. package/src/installs/aws-cli.js +779 -26
  13. package/src/installs/aws-cli.md +727 -0
  14. package/src/installs/balena-etcher.js +688 -26
  15. package/src/installs/balena-etcher.md +761 -0
  16. package/src/installs/bambu-studio.js +912 -26
  17. package/src/installs/bambu-studio.md +780 -0
  18. package/src/installs/bash-completion.js +554 -23
  19. package/src/installs/bash-completion.md +833 -0
  20. package/src/installs/bash.js +399 -26
  21. package/src/installs/bash.md +993 -0
  22. package/src/installs/beyond-compare.js +585 -26
  23. package/src/installs/beyond-compare.md +813 -0
  24. package/src/installs/build-essential.js +511 -26
  25. package/src/installs/build-essential.md +977 -0
  26. package/src/installs/ca-certificates.js +618 -0
  27. package/src/installs/ca-certificates.md +937 -0
  28. package/src/installs/caffeine.js +490 -26
  29. package/src/installs/caffeine.md +839 -0
  30. package/src/installs/camtasia.js +577 -25
  31. package/src/installs/camtasia.md +762 -0
  32. package/src/installs/chatgpt.js +458 -26
  33. package/src/installs/chatgpt.md +814 -0
  34. package/src/installs/chocolatey.js +447 -0
  35. package/src/installs/chocolatey.md +661 -0
  36. package/src/installs/chrome-canary.js +472 -26
  37. package/src/installs/chrome-canary.md +641 -0
  38. package/src/installs/chromium.js +645 -26
  39. package/src/installs/chromium.md +838 -0
  40. package/src/installs/claude-code.js +558 -26
  41. package/src/installs/claude-code.md +1173 -0
  42. package/src/installs/curl.js +361 -26
  43. package/src/installs/curl.md +714 -0
  44. package/src/installs/cursor.js +561 -26
  45. package/src/installs/cursor.md +970 -0
  46. package/src/installs/dbschema.js +674 -26
  47. package/src/installs/dbschema.md +925 -0
  48. package/src/installs/dependencies.md +435 -0
  49. package/src/installs/development-tools.js +600 -0
  50. package/src/installs/development-tools.md +977 -0
  51. package/src/installs/docker.js +1010 -25
  52. package/src/installs/docker.md +1109 -0
  53. package/src/installs/drawio.js +1001 -26
  54. package/src/installs/drawio.md +795 -0
  55. package/src/installs/elmedia-player.js +328 -25
  56. package/src/installs/elmedia-player.md +556 -0
  57. package/src/installs/ffmpeg.js +870 -25
  58. package/src/installs/ffmpeg.md +852 -0
  59. package/src/installs/file.js +464 -0
  60. package/src/installs/file.md +987 -0
  61. package/src/installs/gemini-cli.js +793 -26
  62. package/src/installs/gemini-cli.md +1153 -0
  63. package/src/installs/git.js +382 -26
  64. package/src/installs/git.md +907 -0
  65. package/src/installs/gitego.js +931 -26
  66. package/src/installs/gitego.md +1172 -0
  67. package/src/installs/go.js +913 -26
  68. package/src/installs/go.md +958 -0
  69. package/src/installs/google-chrome.js +801 -25
  70. package/src/installs/google-chrome.md +862 -0
  71. package/src/installs/gpg.js +412 -73
  72. package/src/installs/gpg.md +1056 -0
  73. package/src/installs/homebrew.js +1015 -26
  74. package/src/installs/homebrew.md +988 -0
  75. package/src/installs/imageoptim.js +950 -26
  76. package/src/installs/imageoptim.md +1119 -0
  77. package/src/installs/installers.json +2297 -0
  78. package/src/installs/jq.js +382 -26
  79. package/src/installs/jq.md +809 -0
  80. package/src/installs/keyboard-maestro.js +701 -26
  81. package/src/installs/keyboard-maestro.md +825 -0
  82. package/src/installs/latex.js +771 -26
  83. package/src/installs/latex.md +1095 -0
  84. package/src/installs/lftp.js +338 -26
  85. package/src/installs/lftp.md +907 -0
  86. package/src/installs/lsb-release.js +346 -0
  87. package/src/installs/lsb-release.md +814 -0
  88. package/src/installs/messenger.js +829 -26
  89. package/src/installs/messenger.md +900 -0
  90. package/src/installs/microsoft-office.js +550 -26
  91. package/src/installs/microsoft-office.md +760 -0
  92. package/src/installs/microsoft-teams.js +782 -25
  93. package/src/installs/microsoft-teams.md +886 -0
  94. package/src/installs/node.js +886 -26
  95. package/src/installs/node.md +1153 -0
  96. package/src/installs/nordpass.js +698 -26
  97. package/src/installs/nordpass.md +921 -0
  98. package/src/installs/nvm.js +977 -26
  99. package/src/installs/nvm.md +1057 -0
  100. package/src/installs/openssh.js +734 -64
  101. package/src/installs/openssh.md +1056 -0
  102. package/src/installs/pandoc.js +644 -26
  103. package/src/installs/pandoc.md +1036 -0
  104. package/src/installs/pinentry.js +492 -26
  105. package/src/installs/pinentry.md +1142 -0
  106. package/src/installs/pngyu.js +851 -26
  107. package/src/installs/pngyu.md +896 -0
  108. package/src/installs/postman.js +781 -26
  109. package/src/installs/postman.md +940 -0
  110. package/src/installs/procps.js +425 -0
  111. package/src/installs/procps.md +851 -0
  112. package/src/installs/safari-tech-preview.js +355 -25
  113. package/src/installs/safari-tech-preview.md +533 -0
  114. package/src/installs/sfnt2woff.js +640 -26
  115. package/src/installs/sfnt2woff.md +795 -0
  116. package/src/installs/shellcheck.js +463 -26
  117. package/src/installs/shellcheck.md +1005 -0
  118. package/src/installs/slack.js +722 -25
  119. package/src/installs/slack.md +865 -0
  120. package/src/installs/snagit.js +566 -25
  121. package/src/installs/snagit.md +844 -0
  122. package/src/installs/software-properties-common.js +372 -0
  123. package/src/installs/software-properties-common.md +805 -0
  124. package/src/installs/spotify.js +858 -25
  125. package/src/installs/spotify.md +901 -0
  126. package/src/installs/studio-3t.js +803 -26
  127. package/src/installs/studio-3t.md +918 -0
  128. package/src/installs/sublime-text.js +780 -25
  129. package/src/installs/sublime-text.md +914 -0
  130. package/src/installs/superwhisper.js +687 -25
  131. package/src/installs/superwhisper.md +630 -0
  132. package/src/installs/tailscale.js +727 -26
  133. package/src/installs/tailscale.md +1100 -0
  134. package/src/installs/tar.js +389 -0
  135. package/src/installs/tar.md +946 -0
  136. package/src/installs/termius.js +780 -26
  137. package/src/installs/termius.md +844 -0
  138. package/src/installs/terraform.js +761 -26
  139. package/src/installs/terraform.md +899 -0
  140. package/src/installs/tidal.js +752 -25
  141. package/src/installs/tidal.md +864 -0
  142. package/src/installs/tmux.js +328 -26
  143. package/src/installs/tmux.md +1030 -0
  144. package/src/installs/tree.js +393 -26
  145. package/src/installs/tree.md +833 -0
  146. package/src/installs/unzip.js +460 -0
  147. package/src/installs/unzip.md +879 -0
  148. package/src/installs/vim.js +403 -26
  149. package/src/installs/vim.md +1040 -0
  150. package/src/installs/vlc.js +803 -26
  151. package/src/installs/vlc.md +927 -0
  152. package/src/installs/vscode.js +825 -26
  153. package/src/installs/vscode.md +1002 -0
  154. package/src/installs/wget.js +415 -0
  155. package/src/installs/wget.md +791 -0
  156. package/src/installs/whatsapp.js +710 -25
  157. package/src/installs/whatsapp.md +854 -0
  158. package/src/installs/winpty.js +352 -0
  159. package/src/installs/winpty.md +620 -0
  160. package/src/installs/woff2.js +535 -26
  161. package/src/installs/woff2.md +977 -0
  162. package/src/installs/wsl.js +572 -0
  163. package/src/installs/wsl.md +699 -0
  164. package/src/installs/xcode-clt.js +520 -0
  165. package/src/installs/xcode-clt.md +351 -0
  166. package/src/installs/xcode.js +542 -26
  167. package/src/installs/xcode.md +573 -0
  168. package/src/installs/yarn.js +806 -26
  169. package/src/installs/yarn.md +1074 -0
  170. package/src/installs/yq.js +636 -26
  171. package/src/installs/yq.md +944 -0
  172. package/src/installs/yt-dlp.js +683 -26
  173. package/src/installs/yt-dlp.md +946 -0
  174. package/src/installs/yum-utils.js +297 -0
  175. package/src/installs/yum-utils.md +648 -0
  176. package/src/installs/zoom.js +740 -25
  177. package/src/installs/zoom.md +884 -0
  178. package/src/scripts/README.md +567 -45
  179. package/src/scripts/STATUS.md +208 -0
  180. package/src/scripts/afk.js +395 -7
  181. package/src/scripts/backup-all.js +731 -9
  182. package/src/scripts/backup-source.js +711 -8
  183. package/src/scripts/brewd.js +373 -7
  184. package/src/scripts/brewi.js +505 -9
  185. package/src/scripts/brewr.js +512 -9
  186. package/src/scripts/brews.js +462 -9
  187. package/src/scripts/brewu.js +488 -7
  188. package/src/scripts/c.js +185 -7
  189. package/src/scripts/ccurl.js +325 -8
  190. package/src/scripts/certbot-crontab-init.js +488 -8
  191. package/src/scripts/certbot-init.js +641 -9
  192. package/src/scripts/ch.js +339 -7
  193. package/src/scripts/claude-danger.js +253 -8
  194. package/src/scripts/clean-dev.js +419 -8
  195. package/src/scripts/clear-dns-cache.js +525 -7
  196. package/src/scripts/clone.js +417 -7
  197. package/src/scripts/code-all.js +420 -7
  198. package/src/scripts/count-files.js +195 -8
  199. package/src/scripts/count-folders.js +195 -8
  200. package/src/scripts/count.js +248 -8
  201. package/src/scripts/d.js +203 -7
  202. package/src/scripts/datauri.js +373 -8
  203. package/src/scripts/delete-files.js +363 -7
  204. package/src/scripts/docker-clean.js +410 -8
  205. package/src/scripts/dp.js +426 -7
  206. package/src/scripts/e.js +375 -9
  207. package/src/scripts/empty-trash.js +497 -7
  208. package/src/scripts/evm.js +428 -9
  209. package/src/scripts/fetch-github-repos.js +441 -10
  210. package/src/scripts/get-channel.js +329 -8
  211. package/src/scripts/get-course.js +384 -11
  212. package/src/scripts/get-dependencies.js +290 -9
  213. package/src/scripts/get-folder.js +783 -10
  214. package/src/scripts/get-tunes.js +411 -10
  215. package/src/scripts/get-video.js +352 -9
  216. package/src/scripts/git-backup.js +561 -9
  217. package/src/scripts/git-clone.js +477 -9
  218. package/src/scripts/git-pup.js +303 -7
  219. package/src/scripts/git-push.js +380 -8
  220. package/src/scripts/h.js +607 -9
  221. package/src/scripts/hide-desktop-icons.js +483 -7
  222. package/src/scripts/hide-hidden-files.js +522 -7
  223. package/src/scripts/install-dependencies-from.js +440 -9
  224. package/src/scripts/ips.js +647 -10
  225. package/src/scripts/iso.js +354 -8
  226. package/src/scripts/killni.js +561 -7
  227. package/src/scripts/ll.js +451 -8
  228. package/src/scripts/local-ip.js +310 -8
  229. package/src/scripts/m.js +508 -8
  230. package/src/scripts/map.js +293 -8
  231. package/src/scripts/mkd.js +287 -7
  232. package/src/scripts/ncu-update-all.js +441 -8
  233. package/src/scripts/nginx-init.js +702 -12
  234. package/src/scripts/npmi.js +366 -7
  235. package/src/scripts/o.js +495 -8
  236. package/src/scripts/org-by-date.js +321 -7
  237. package/src/scripts/p.js +208 -7
  238. package/src/scripts/packages.js +313 -8
  239. package/src/scripts/path.js +209 -7
  240. package/src/scripts/ports.js +582 -8
  241. package/src/scripts/q.js +290 -8
  242. package/src/scripts/refresh-files.js +378 -10
  243. package/src/scripts/remove-smaller-files.js +500 -8
  244. package/src/scripts/rename-files-with-date.js +517 -9
  245. package/src/scripts/resize-image.js +523 -9
  246. package/src/scripts/rm-safe.js +653 -8
  247. package/src/scripts/s.js +525 -9
  248. package/src/scripts/set-git-public.js +349 -7
  249. package/src/scripts/show-desktop-icons.js +459 -7
  250. package/src/scripts/show-hidden-files.js +456 -7
  251. package/src/scripts/tpa.js +265 -8
  252. package/src/scripts/tpo.js +264 -7
  253. package/src/scripts/u.js +489 -7
  254. package/src/scripts/vpush.js +422 -8
  255. package/src/scripts/y.js +267 -7
  256. package/src/utils/common/os.js +94 -2
  257. package/src/utils/ubuntu/apt.js +13 -7
@@ -0,0 +1,1056 @@
1
+ # Installing GPG (GnuPG)
2
+
3
+ ## Overview
4
+
5
+ GnuPG (GNU Privacy Guard), commonly known as GPG, is a free and open-source implementation of the OpenPGP standard (RFC 4880). It enables you to encrypt and sign your data and communications, providing cryptographic privacy and authentication.
6
+
7
+ GPG enables developers to:
8
+
9
+ - Sign Git commits and tags to verify authorship
10
+ - Encrypt sensitive files and communications
11
+ - Verify the integrity and authenticity of downloaded software
12
+ - Manage cryptographic keys for secure communications
13
+ - Authenticate to remote services using GPG keys
14
+
15
+ GnuPG is an essential tool for secure software development workflows, particularly for signing Git commits (a requirement for many open-source projects and enterprise environments).
16
+
17
+ This guide documents GPG installation procedures for all platforms supported by DevUtils CLI.
18
+
19
+ ## Dependencies
20
+
21
+ ### macOS (Homebrew)
22
+
23
+ - **Required:**
24
+ - `homebrew` - Install via `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` or run `dev install homebrew`
25
+ - **Optional:** None
26
+ - **Auto-installed:**
27
+ - `pinentry-mac` - Installed automatically by the script for GUI passphrase dialogs (required for signing Git commits in GUI applications)
28
+
29
+ ### Ubuntu (APT/Snap)
30
+
31
+ - **Required:** None
32
+ - **Optional:**
33
+ - `pinentry-gnome3` - For GUI passphrase dialogs in desktop environments. Install via `sudo apt install pinentry-gnome3`
34
+ - `pinentry-curses` - For terminal-based passphrase entry (included with `gnupg` package by default)
35
+ - **Auto-installed:** None
36
+
37
+ ### Raspberry Pi OS (APT/Snap)
38
+
39
+ - **Required:** None
40
+ - **Optional:**
41
+ - `pinentry-curses` - For terminal-based passphrase entry on headless systems (included with `gnupg` package by default). Install via `sudo apt install pinentry-curses`
42
+ - `haveged` - For improving entropy generation during key creation on headless systems. Install via `sudo apt install haveged`
43
+ - **Auto-installed:** None
44
+
45
+ ### Amazon Linux (DNF/YUM)
46
+
47
+ - **Required:** None
48
+ - **Optional:** None
49
+ - **Auto-installed:** None
50
+ - **Notes:**
51
+ - Amazon Linux 2023 ships with `gnupg2-minimal` by default, which the script replaces with `gnupg2-full` using `dnf swap`
52
+ - Amazon Linux 2 installs `gnupg2` directly
53
+
54
+ ### Windows (Chocolatey/winget)
55
+
56
+ - **Required:**
57
+ - Either `winget` (built into Windows 10 1809+ and Windows 11) or `chocolatey` - Install Chocolatey via PowerShell: `Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))` or run `dev install chocolatey`
58
+ - **Optional:** None
59
+ - **Auto-installed:**
60
+ - Graphical pinentry for Windows - Included with GnuPG for Windows installation
61
+
62
+ ### Git Bash (Manual/Portable)
63
+
64
+ - **Required:**
65
+ - Windows GPG installation - Must install GPG on Windows first using winget or Chocolatey (see Windows section above)
66
+ - `git` - Install via Git for Windows installer from https://git-scm.com/download/win
67
+ - **Optional:** None
68
+ - **Auto-installed:** None
69
+ - **Notes:**
70
+ - Git Bash does not have a separate GPG installation; it configures Git to use the Windows GPG binary at `/c/Program Files (x86)/GnuPG/bin/gpg.exe`
71
+
72
+ ## Prerequisites
73
+
74
+ Before installing GPG on any platform, ensure:
75
+
76
+ 1. **Internet connectivity** - Required to download GPG packages
77
+ 2. **Administrative privileges** - Required for system-wide installation
78
+ 3. **Terminal access** - Required to run installation commands
79
+
80
+ ## Platform-Specific Installation
81
+
82
+ ### macOS (Homebrew)
83
+
84
+ #### Prerequisites
85
+
86
+ - macOS 10.15 (Catalina) or later (macOS 14 Sonoma or later recommended)
87
+ - Homebrew package manager installed
88
+ - Command line access via Terminal.app or iTerm2
89
+
90
+ If Homebrew is not installed, install it first:
91
+
92
+ ```bash
93
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
94
+ ```
95
+
96
+ #### Installation Steps
97
+
98
+ Run the following commands to install GnuPG and pinentry-mac (for GUI passphrase dialogs):
99
+
100
+ ```bash
101
+ brew install --quiet gnupg
102
+ brew install --quiet pinentry-mac
103
+ ```
104
+
105
+ The `--quiet` flag suppresses non-essential output, making the installation suitable for automation and scripts.
106
+
107
+ **Configure pinentry-mac for passphrase dialogs:**
108
+
109
+ Create the GnuPG configuration directory and configure the GPG agent to use pinentry-mac:
110
+
111
+ ```bash
112
+ mkdir -p ~/.gnupg
113
+ chmod 700 ~/.gnupg
114
+ echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
115
+ gpgconf --kill gpg-agent
116
+ ```
117
+
118
+ This configuration enables a native macOS dialog for entering GPG passphrases, which is required for signing Git commits.
119
+
120
+ #### Verification
121
+
122
+ Confirm the installation succeeded:
123
+
124
+ ```bash
125
+ gpg --version
126
+ ```
127
+
128
+ Expected output (version numbers may vary):
129
+
130
+ ```
131
+ gpg (GnuPG) 2.4.9
132
+ libgcrypt 1.10.3
133
+ ...
134
+ ```
135
+
136
+ Verify pinentry-mac is configured:
137
+
138
+ ```bash
139
+ cat ~/.gnupg/gpg-agent.conf
140
+ ```
141
+
142
+ Expected output should include:
143
+
144
+ ```
145
+ pinentry-program /opt/homebrew/bin/pinentry-mac
146
+ ```
147
+
148
+ (On Intel Macs, the path will be `/usr/local/bin/pinentry-mac`)
149
+
150
+ #### Troubleshooting
151
+
152
+ **Problem**: `gpg --version` shows an older version after installation
153
+
154
+ **Solution**: The system may have a different GPG in PATH. Ensure Homebrew's bin directory is first in your PATH:
155
+
156
+ ```bash
157
+ echo 'export PATH="$(brew --prefix)/bin:$PATH"' >> ~/.zshrc
158
+ source ~/.zshrc
159
+ ```
160
+
161
+ **Problem**: `brew: command not found`
162
+
163
+ **Solution**: Homebrew is not installed or not in PATH. Install Homebrew first:
164
+
165
+ ```bash
166
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
167
+ ```
168
+
169
+ **Problem**: Passphrase prompt does not appear when signing commits
170
+
171
+ **Solution**: The GPG agent may not be using pinentry-mac. Verify the configuration and restart the agent:
172
+
173
+ ```bash
174
+ echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf
175
+ gpgconf --kill gpg-agent
176
+ ```
177
+
178
+ **Problem**: "No pinentry" error when generating keys
179
+
180
+ **Solution**: Install and configure pinentry-mac as shown above, then restart the GPG agent.
181
+
182
+ **Problem**: Permission errors on `~/.gnupg`
183
+
184
+ **Solution**: Fix permissions on the GnuPG directory:
185
+
186
+ ```bash
187
+ chmod 700 ~/.gnupg
188
+ chmod 600 ~/.gnupg/*
189
+ ```
190
+
191
+ ---
192
+
193
+ ### Ubuntu/Debian (APT)
194
+
195
+ #### Prerequisites
196
+
197
+ - Ubuntu 20.04 LTS or later, or Debian 11 (Bullseye) or later
198
+ - sudo privileges
199
+ - Internet connectivity
200
+
201
+ GnuPG is included in the default Ubuntu and Debian repositories and may already be installed on most systems.
202
+
203
+ #### Installation Steps
204
+
205
+ Run the following commands to update package lists and install GnuPG:
206
+
207
+ ```bash
208
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
209
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
210
+ ```
211
+
212
+ The `DEBIAN_FRONTEND=noninteractive` environment variable ensures no interactive prompts appear during installation, making this suitable for scripts and automation.
213
+
214
+ **Note**: On modern Debian/Ubuntu systems (Debian 12+, Ubuntu 22.04+), the `gnupg` package installs GnuPG version 2.x. The `gpg` command automatically uses version 2.
215
+
216
+ #### Verification
217
+
218
+ Confirm the installation succeeded:
219
+
220
+ ```bash
221
+ gpg --version
222
+ ```
223
+
224
+ Expected output (version numbers may vary):
225
+
226
+ ```
227
+ gpg (GnuPG) 2.2.40
228
+ libgcrypt 1.10.1
229
+ ...
230
+ ```
231
+
232
+ Verify the installation location:
233
+
234
+ ```bash
235
+ which gpg
236
+ ```
237
+
238
+ Expected output:
239
+
240
+ ```
241
+ /usr/bin/gpg
242
+ ```
243
+
244
+ #### Troubleshooting
245
+
246
+ **Problem**: `E: Unable to locate package gnupg`
247
+
248
+ **Solution**: Update your package lists:
249
+
250
+ ```bash
251
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
252
+ ```
253
+
254
+ **Problem**: Old version of GPG installed
255
+
256
+ **Solution**: On Ubuntu, you can use the official GnuPG repository for newer versions. However, the default repository version is sufficient for most use cases including Git commit signing.
257
+
258
+ **Problem**: "No pinentry" error when generating keys
259
+
260
+ **Solution**: Install a pinentry package appropriate for your environment:
261
+
262
+ ```bash
263
+ # For GUI environments
264
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-gnome3
265
+
266
+ # For terminal/server environments
267
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
268
+ ```
269
+
270
+ **Problem**: `gpg-agent` errors
271
+
272
+ **Solution**: Restart the GPG agent:
273
+
274
+ ```bash
275
+ gpgconf --kill gpg-agent
276
+ gpg-agent --daemon
277
+ ```
278
+
279
+ ---
280
+
281
+ ### Raspberry Pi OS (APT)
282
+
283
+ #### Prerequisites
284
+
285
+ - Raspberry Pi OS (Bookworm or Bullseye recommended)
286
+ - Raspberry Pi 3B+ or later (any model supported by Raspberry Pi OS)
287
+ - sudo privileges
288
+ - Internet connectivity
289
+
290
+ Raspberry Pi OS is based on Debian, so GPG installation follows the Debian/APT method. GPG works on both 32-bit (armhf) and 64-bit (arm64) architectures.
291
+
292
+ #### Installation Steps
293
+
294
+ First, verify your architecture:
295
+
296
+ ```bash
297
+ uname -m
298
+ ```
299
+
300
+ - `aarch64` = 64-bit ARM
301
+ - `armv7l` = 32-bit ARM
302
+
303
+ Install GnuPG using APT:
304
+
305
+ ```bash
306
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
307
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
308
+ ```
309
+
310
+ The installation command is identical for both 32-bit and 64-bit Raspberry Pi OS.
311
+
312
+ **For headless/server installations**, install pinentry-curses for terminal-based passphrase entry:
313
+
314
+ ```bash
315
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
316
+ ```
317
+
318
+ #### Verification
319
+
320
+ Confirm the installation succeeded:
321
+
322
+ ```bash
323
+ gpg --version
324
+ ```
325
+
326
+ Expected output (version numbers may vary):
327
+
328
+ ```
329
+ gpg (GnuPG) 2.2.40
330
+ libgcrypt 1.10.1
331
+ ...
332
+ ```
333
+
334
+ Verify the installation location:
335
+
336
+ ```bash
337
+ which gpg
338
+ ```
339
+
340
+ Expected output:
341
+
342
+ ```
343
+ /usr/bin/gpg
344
+ ```
345
+
346
+ #### Troubleshooting
347
+
348
+ **Problem**: Installation is slow
349
+
350
+ **Solution**: Raspberry Pi SD cards can be slow. Use a high-quality SD card (Class 10 or A1/A2 rated) or boot from USB/SSD for better performance.
351
+
352
+ **Problem**: "No pinentry" error when generating keys on headless Pi
353
+
354
+ **Solution**: Install and configure pinentry-curses:
355
+
356
+ ```bash
357
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
358
+ mkdir -p ~/.gnupg
359
+ echo "pinentry-program /usr/bin/pinentry-curses" > ~/.gnupg/gpg-agent.conf
360
+ gpgconf --kill gpg-agent
361
+ ```
362
+
363
+ **Problem**: `E: Unable to fetch some archives`
364
+
365
+ **Solution**: Network connectivity issues. Check your internet connection and retry:
366
+
367
+ ```bash
368
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
369
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
370
+ ```
371
+
372
+ **Problem**: Key generation hangs (waiting for entropy)
373
+
374
+ **Solution**: On headless Raspberry Pi systems, the entropy pool may be low. Install `haveged` to improve entropy generation:
375
+
376
+ ```bash
377
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y haveged
378
+ sudo systemctl enable haveged
379
+ sudo systemctl start haveged
380
+ ```
381
+
382
+ ---
383
+
384
+ ### Amazon Linux (DNF/YUM)
385
+
386
+ #### Prerequisites
387
+
388
+ - Amazon Linux 2023 (AL2023) or Amazon Linux 2 (AL2)
389
+ - sudo privileges
390
+ - EC2 instance or compatible environment
391
+
392
+ Amazon Linux 2023 uses DNF as the default package manager. Amazon Linux 2 uses YUM.
393
+
394
+ **Important**: Amazon Linux 2023 ships with `gnupg2-minimal` by default, which provides only basic GPG functionality for package signature verification. For full GPG functionality (including key server access and Git commit signing), you need `gnupg2-full`.
395
+
396
+ #### Installation Steps
397
+
398
+ **For Amazon Linux 2023 (AL2023):**
399
+
400
+ Replace the minimal package with the full package:
401
+
402
+ ```bash
403
+ sudo dnf swap -y gnupg2-minimal gnupg2-full
404
+ ```
405
+
406
+ The `dnf swap` command removes `gnupg2-minimal` and installs `gnupg2-full` in a single transaction, handling the package conflict automatically.
407
+
408
+ **For Amazon Linux 2 (AL2):**
409
+
410
+ ```bash
411
+ sudo yum install -y gnupg2
412
+ ```
413
+
414
+ The `-y` flag automatically confirms installation, enabling non-interactive execution.
415
+
416
+ #### Verification
417
+
418
+ Confirm the installation succeeded:
419
+
420
+ ```bash
421
+ gpg --version
422
+ ```
423
+
424
+ Expected output (version numbers may vary):
425
+
426
+ ```
427
+ gpg (GnuPG) 2.3.8
428
+ libgcrypt 1.10.1
429
+ ...
430
+ ```
431
+
432
+ Verify the installation location:
433
+
434
+ ```bash
435
+ which gpg
436
+ ```
437
+
438
+ Expected output:
439
+
440
+ ```
441
+ /usr/bin/gpg
442
+ ```
443
+
444
+ **For Amazon Linux 2023**, verify you have the full package:
445
+
446
+ ```bash
447
+ rpm -q gnupg2-full
448
+ ```
449
+
450
+ Expected output:
451
+
452
+ ```
453
+ gnupg2-full-2.3.8-1.amzn2023.0.4.x86_64
454
+ ```
455
+
456
+ #### Troubleshooting
457
+
458
+ **Problem**: `keyserver receive failed: No dirmngr` on AL2023
459
+
460
+ **Solution**: You have the minimal package installed. Install the full package:
461
+
462
+ ```bash
463
+ sudo dnf swap -y gnupg2-minimal gnupg2-full
464
+ ```
465
+
466
+ **Problem**: `package gnupg2-minimal conflicts with gnupg2` error
467
+
468
+ **Solution**: Use `dnf swap` instead of `dnf install` to handle the conflict:
469
+
470
+ ```bash
471
+ sudo dnf swap -y gnupg2-minimal gnupg2-full
472
+ ```
473
+
474
+ **Problem**: `No match for argument: gnupg2` on Amazon Linux 2
475
+
476
+ **Solution**: Update the yum cache and retry:
477
+
478
+ ```bash
479
+ sudo yum makecache
480
+ sudo yum install -y gnupg2
481
+ ```
482
+
483
+ **Problem**: Permission denied errors
484
+
485
+ **Solution**: Ensure you are using sudo:
486
+
487
+ ```bash
488
+ sudo dnf swap -y gnupg2-minimal gnupg2-full
489
+ ```
490
+
491
+ ---
492
+
493
+ ### Windows (Chocolatey/winget)
494
+
495
+ #### Prerequisites
496
+
497
+ - Windows 10 version 1903 or higher (64-bit), or Windows 11
498
+ - Administrator PowerShell or Command Prompt
499
+ - Chocolatey or winget package manager installed
500
+
501
+ **Recommended**: Use winget (built into Windows 10 1809+ and Windows 11). If winget is unavailable, use Chocolatey.
502
+
503
+ If Chocolatey is not installed and you prefer to use it, install it first by running this command in an Administrator PowerShell:
504
+
505
+ ```powershell
506
+ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
507
+ ```
508
+
509
+ #### Installation Steps
510
+
511
+ **Using winget (recommended):**
512
+
513
+ Run the following command in an Administrator PowerShell or Command Prompt:
514
+
515
+ ```powershell
516
+ winget install --id GnuPG.GnuPG --silent --accept-package-agreements --accept-source-agreements
517
+ ```
518
+
519
+ **Using Chocolatey:**
520
+
521
+ ```powershell
522
+ choco install gnupg -y
523
+ ```
524
+
525
+ The `--silent` flag (winget) and `-y` flag (Chocolatey) ensure non-interactive installation suitable for automation and scripts.
526
+
527
+ After installation, close and reopen your terminal to ensure PATH changes take effect.
528
+
529
+ #### Verification
530
+
531
+ Open a new Command Prompt or PowerShell window, then run:
532
+
533
+ ```powershell
534
+ gpg --version
535
+ ```
536
+
537
+ Expected output (version numbers may vary):
538
+
539
+ ```
540
+ gpg (GnuPG) 2.4.5
541
+ libgcrypt 1.10.3
542
+ ...
543
+ ```
544
+
545
+ Verify the installation location:
546
+
547
+ ```powershell
548
+ where gpg
549
+ ```
550
+
551
+ Expected output:
552
+
553
+ ```
554
+ C:\Program Files (x86)\GnuPG\bin\gpg.exe
555
+ ```
556
+
557
+ #### Troubleshooting
558
+
559
+ **Problem**: `gpg: command not found` or `'gpg' is not recognized`
560
+
561
+ **Solution**: Close and reopen your terminal window. If the problem persists, add GPG to your PATH manually:
562
+
563
+ ```powershell
564
+ $env:PATH += ";C:\Program Files (x86)\GnuPG\bin"
565
+ ```
566
+
567
+ To make this permanent, add the path via System Properties > Environment Variables, or run in Administrator PowerShell:
568
+
569
+ ```powershell
570
+ [Environment]::SetEnvironmentVariable("PATH", $env:PATH + ";C:\Program Files (x86)\GnuPG\bin", [EnvironmentVariableTarget]::Machine)
571
+ ```
572
+
573
+ **Problem**: winget installation fails
574
+
575
+ **Solution**: Fall back to Chocolatey:
576
+
577
+ ```powershell
578
+ choco install gnupg -y
579
+ ```
580
+
581
+ **Problem**: Passphrase dialog does not appear
582
+
583
+ **Solution**: GnuPG on Windows includes a graphical pinentry. Ensure the gpg-agent is running:
584
+
585
+ ```powershell
586
+ gpg-connect-agent /bye
587
+ ```
588
+
589
+ **Problem**: Chocolatey installation fails
590
+
591
+ **Solution**: Ensure you are running PowerShell as Administrator. Right-click PowerShell and select "Run as administrator".
592
+
593
+ ---
594
+
595
+ ### WSL (Ubuntu)
596
+
597
+ #### Prerequisites
598
+
599
+ - Windows 10 version 2004 or higher, or Windows 11
600
+ - WSL 2 enabled with Ubuntu distribution installed
601
+ - sudo privileges within WSL
602
+
603
+ WSL runs Ubuntu (or another Linux distribution) within Windows. GPG must be installed separately within WSL, as it does not share binaries with Windows GPG.
604
+
605
+ #### Installation Steps
606
+
607
+ Open your WSL Ubuntu terminal and run:
608
+
609
+ ```bash
610
+ sudo DEBIAN_FRONTEND=noninteractive apt-get update -y
611
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
612
+ ```
613
+
614
+ **Optional**: For GUI passphrase dialogs when using WSL with a graphical environment, install pinentry-gnome3:
615
+
616
+ ```bash
617
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-gnome3
618
+ ```
619
+
620
+ For terminal-only WSL usage, pinentry-curses is sufficient (included with gnupg).
621
+
622
+ #### Verification
623
+
624
+ Confirm the installation succeeded:
625
+
626
+ ```bash
627
+ gpg --version
628
+ ```
629
+
630
+ Expected output (version numbers may vary):
631
+
632
+ ```
633
+ gpg (GnuPG) 2.2.40
634
+ libgcrypt 1.10.1
635
+ ...
636
+ ```
637
+
638
+ Verify the installation location:
639
+
640
+ ```bash
641
+ which gpg
642
+ ```
643
+
644
+ Expected output:
645
+
646
+ ```
647
+ /usr/bin/gpg
648
+ ```
649
+
650
+ #### Troubleshooting
651
+
652
+ **Problem**: GPG version differs between WSL and Windows
653
+
654
+ **Solution**: This is expected behavior. WSL and Windows maintain separate GPG installations. Use the appropriate GPG for each environment:
655
+
656
+ - Inside WSL terminal: Use Linux GPG (`/usr/bin/gpg`)
657
+ - In Windows PowerShell/CMD: Use Windows GPG (`C:\Program Files (x86)\GnuPG\bin\gpg.exe`)
658
+
659
+ **Problem**: Cannot share GPG keys between WSL and Windows
660
+
661
+ **Solution**: GPG keys are stored in different locations for each environment. You can export and import keys between environments:
662
+
663
+ ```bash
664
+ # In WSL, export your key
665
+ gpg --export-secret-keys --armor your-key-id > private-key.asc
666
+
667
+ # In Windows PowerShell, import the key
668
+ gpg --import "\\wsl$\Ubuntu\home\username\private-key.asc"
669
+ ```
670
+
671
+ **Problem**: "No pinentry" error in WSL
672
+
673
+ **Solution**: Ensure pinentry is installed and configured:
674
+
675
+ ```bash
676
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
677
+ mkdir -p ~/.gnupg
678
+ echo "pinentry-program /usr/bin/pinentry-curses" > ~/.gnupg/gpg-agent.conf
679
+ gpgconf --kill gpg-agent
680
+ ```
681
+
682
+ **Problem**: Permission errors in WSL
683
+
684
+ **Solution**: Ensure you are using sudo for installation:
685
+
686
+ ```bash
687
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gnupg
688
+ ```
689
+
690
+ ---
691
+
692
+ ### Git Bash (Windows Installation)
693
+
694
+ #### Prerequisites
695
+
696
+ - Windows 10 or Windows 11 (64-bit)
697
+ - Git Bash installed (comes with Git for Windows)
698
+ - GPG installed on Windows (see Windows section)
699
+
700
+ **Note**: Git Bash on Windows does not include a usable GPG installation by default. Git for Windows ships with an older GPG 1.4.x in the MinGW environment, but this is insufficient for modern use cases like Git commit signing. You must install GPG on Windows separately.
701
+
702
+ #### Installation Steps
703
+
704
+ **Step 1: Install GPG on Windows**
705
+
706
+ First, install GPG on Windows using winget (run in Administrator PowerShell):
707
+
708
+ ```powershell
709
+ winget install --id GnuPG.GnuPG --silent --accept-package-agreements --accept-source-agreements
710
+ ```
711
+
712
+ Or using Chocolatey:
713
+
714
+ ```powershell
715
+ choco install gnupg -y
716
+ ```
717
+
718
+ **Step 2: Configure Git to use Windows GPG**
719
+
720
+ Open Git Bash and configure Git to use the Windows GPG installation instead of the bundled MinGW GPG:
721
+
722
+ ```bash
723
+ git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
724
+ ```
725
+
726
+ This tells Git to use the Windows GPG for all signing operations.
727
+
728
+ **Step 3: Close and reopen Git Bash**
729
+
730
+ Close all Git Bash windows and open a new one to ensure environment changes take effect.
731
+
732
+ #### Verification
733
+
734
+ In Git Bash, confirm GPG is accessible via the configured path:
735
+
736
+ ```bash
737
+ "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --version
738
+ ```
739
+
740
+ Expected output (version numbers may vary):
741
+
742
+ ```
743
+ gpg (GnuPG) 2.4.5
744
+ libgcrypt 1.10.3
745
+ ...
746
+ ```
747
+
748
+ Verify Git is configured to use Windows GPG:
749
+
750
+ ```bash
751
+ git config --global gpg.program
752
+ ```
753
+
754
+ Expected output:
755
+
756
+ ```
757
+ /c/Program Files (x86)/GnuPG/bin/gpg.exe
758
+ ```
759
+
760
+ #### Troubleshooting
761
+
762
+ **Problem**: `gpg` command in Git Bash uses old version
763
+
764
+ **Solution**: Git Bash's built-in GPG is old and limited. Configure Git to use Windows GPG:
765
+
766
+ ```bash
767
+ git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
768
+ ```
769
+
770
+ You can also create an alias to use Windows GPG directly:
771
+
772
+ ```bash
773
+ echo 'alias gpg="/c/Program\ Files\ \(x86\)/GnuPG/bin/gpg.exe"' >> ~/.bashrc
774
+ source ~/.bashrc
775
+ ```
776
+
777
+ **Problem**: Git commit signing fails with "secret key not available"
778
+
779
+ **Solution**: Keys must be imported into Windows GPG, not the Git Bash MinGW GPG. Use the Windows GPG to generate or import keys:
780
+
781
+ ```bash
782
+ "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --list-secret-keys
783
+ ```
784
+
785
+ If no keys are listed, generate one:
786
+
787
+ ```bash
788
+ "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --full-generate-key
789
+ ```
790
+
791
+ **Problem**: GPG passphrase prompt does not appear
792
+
793
+ **Solution**: Windows GPG uses a graphical pinentry that may not work correctly from Git Bash in some configurations. Ensure the GPG agent is running:
794
+
795
+ ```bash
796
+ "/c/Program Files (x86)/GnuPG/bin/gpg-connect-agent.exe" /bye
797
+ ```
798
+
799
+ **Problem**: "gpg: signing failed: Inappropriate ioctl for device"
800
+
801
+ **Solution**: This occurs when GPG cannot open a TTY for passphrase entry. Set the GPG_TTY environment variable:
802
+
803
+ ```bash
804
+ echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
805
+ source ~/.bashrc
806
+ ```
807
+
808
+ **Problem**: Path issues with spaces in "Program Files (x86)"
809
+
810
+ **Solution**: Always quote paths or escape spaces when referencing the GPG executable:
811
+
812
+ ```bash
813
+ # Using quotes
814
+ "/c/Program Files (x86)/GnuPG/bin/gpg.exe" --version
815
+
816
+ # Or escaping spaces
817
+ /c/Program\ Files\ \(x86\)/GnuPG/bin/gpg.exe --version
818
+ ```
819
+
820
+ ---
821
+
822
+ ## Post-Installation Configuration
823
+
824
+ After installing GPG on any platform, configure it for Git commit signing (the most common developer use case).
825
+
826
+ ### Generate a GPG Key
827
+
828
+ Generate a new GPG key pair:
829
+
830
+ ```bash
831
+ gpg --full-generate-key
832
+ ```
833
+
834
+ When prompted:
835
+
836
+ 1. Select key type: Choose `(1) RSA and RSA` or `(9) ECC and ECC` (recommended)
837
+ 2. For ECC, select `(1) Curve 25519`
838
+ 3. Key validity: Choose `2y` (2 years) or `0` (no expiration)
839
+ 4. Enter your name and email (use the same email as your Git commits)
840
+ 5. Set a strong passphrase
841
+
842
+ ### List Your GPG Keys
843
+
844
+ View your secret keys:
845
+
846
+ ```bash
847
+ gpg --list-secret-keys --keyid-format=long
848
+ ```
849
+
850
+ Example output:
851
+
852
+ ```
853
+ sec ed25519/ABC123DEF456GH78 2024-01-15 [SC] [expires: 2026-01-15]
854
+ 1234567890ABCDEF1234567890ABCDEF12345678
855
+ uid [ultimate] Your Name <your.email@example.com>
856
+ ssb cv25519/XYZ789ABC123DE45 2024-01-15 [E] [expires: 2026-01-15]
857
+ ```
858
+
859
+ The key ID is the string after `ed25519/` or `rsa4096/` (e.g., `ABC123DEF456GH78`).
860
+
861
+ ### Configure Git to Sign Commits
862
+
863
+ Tell Git which GPG key to use:
864
+
865
+ ```bash
866
+ git config --global user.signingkey ABC123DEF456GH78
867
+ ```
868
+
869
+ Enable automatic commit signing:
870
+
871
+ ```bash
872
+ git config --global commit.gpgsign true
873
+ ```
874
+
875
+ Enable automatic tag signing:
876
+
877
+ ```bash
878
+ git config --global tag.gpgsign true
879
+ ```
880
+
881
+ ### Export Your Public Key for GitHub/GitLab
882
+
883
+ Export your public key in ASCII-armored format:
884
+
885
+ ```bash
886
+ gpg --armor --export ABC123DEF456GH78
887
+ ```
888
+
889
+ Copy the entire output (including `-----BEGIN PGP PUBLIC KEY BLOCK-----` and `-----END PGP PUBLIC KEY BLOCK-----`) and add it to your GitHub/GitLab account settings under GPG keys.
890
+
891
+ ### Configure GPG Agent Caching
892
+
893
+ To avoid entering your passphrase repeatedly, configure the GPG agent cache timeout. Create or edit `~/.gnupg/gpg-agent.conf`:
894
+
895
+ ```bash
896
+ mkdir -p ~/.gnupg
897
+ cat >> ~/.gnupg/gpg-agent.conf << 'EOF'
898
+ default-cache-ttl 3600
899
+ max-cache-ttl 86400
900
+ EOF
901
+ gpgconf --kill gpg-agent
902
+ ```
903
+
904
+ This caches your passphrase for 1 hour (3600 seconds), with a maximum of 24 hours (86400 seconds).
905
+
906
+ ---
907
+
908
+ ## Common Issues
909
+
910
+ ### Issue: "No secret key" When Signing Commits
911
+
912
+ **Symptoms**: `gpg: signing failed: No secret key`
913
+
914
+ **Solutions**:
915
+
916
+ - Verify your key exists:
917
+
918
+ ```bash
919
+ gpg --list-secret-keys --keyid-format=long
920
+ ```
921
+
922
+ - Ensure Git is configured with the correct key ID:
923
+
924
+ ```bash
925
+ git config --global user.signingkey YOUR_KEY_ID
926
+ ```
927
+
928
+ - On Windows Git Bash, ensure Git uses Windows GPG:
929
+
930
+ ```bash
931
+ git config --global gpg.program "/c/Program Files (x86)/GnuPG/bin/gpg.exe"
932
+ ```
933
+
934
+ ### Issue: "Inappropriate ioctl for device"
935
+
936
+ **Symptoms**: `gpg: signing failed: Inappropriate ioctl for device`
937
+
938
+ **Solutions**:
939
+
940
+ - Set the GPG_TTY environment variable:
941
+
942
+ ```bash
943
+ export GPG_TTY=$(tty)
944
+ ```
945
+
946
+ - Add to your shell profile (`~/.bashrc`, `~/.zshrc`):
947
+
948
+ ```bash
949
+ echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
950
+ ```
951
+
952
+ ### Issue: Passphrase Prompt Not Appearing
953
+
954
+ **Symptoms**: GPG hangs waiting for passphrase, or fails immediately
955
+
956
+ **Solutions**:
957
+
958
+ - **macOS**: Ensure pinentry-mac is installed and configured:
959
+
960
+ ```bash
961
+ brew install --quiet pinentry-mac
962
+ echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" > ~/.gnupg/gpg-agent.conf
963
+ gpgconf --kill gpg-agent
964
+ ```
965
+
966
+ - **Linux**: Ensure appropriate pinentry is installed:
967
+
968
+ ```bash
969
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
970
+ ```
971
+
972
+ - Restart the GPG agent:
973
+
974
+ ```bash
975
+ gpgconf --kill gpg-agent
976
+ ```
977
+
978
+ ### Issue: "No pinentry" Error
979
+
980
+ **Symptoms**: `gpg: problem with the agent: No pinentry`
981
+
982
+ **Solutions**:
983
+
984
+ - Install pinentry for your platform:
985
+
986
+ ```bash
987
+ # macOS
988
+ brew install --quiet pinentry-mac
989
+
990
+ # Ubuntu/Debian/Raspberry Pi
991
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pinentry-curses
992
+ ```
993
+
994
+ - Configure gpg-agent to use the correct pinentry:
995
+
996
+ ```bash
997
+ mkdir -p ~/.gnupg
998
+ echo "pinentry-program /path/to/pinentry" > ~/.gnupg/gpg-agent.conf
999
+ gpgconf --kill gpg-agent
1000
+ ```
1001
+
1002
+ ### Issue: Key Generation Hangs
1003
+
1004
+ **Symptoms**: Key generation never completes, appears frozen
1005
+
1006
+ **Solutions**:
1007
+
1008
+ - This usually indicates insufficient entropy. Generate activity on the system (move mouse, type, disk activity).
1009
+
1010
+ - On headless systems, install `haveged`:
1011
+
1012
+ ```bash
1013
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y haveged
1014
+ sudo systemctl enable haveged
1015
+ sudo systemctl start haveged
1016
+ ```
1017
+
1018
+ ### Issue: Cannot Import Keys from Another System
1019
+
1020
+ **Symptoms**: Imported keys are not usable for signing
1021
+
1022
+ **Solutions**:
1023
+
1024
+ - Export and import both public and secret keys:
1025
+
1026
+ ```bash
1027
+ # On source system
1028
+ gpg --export-secret-keys --armor KEY_ID > private.asc
1029
+ gpg --export --armor KEY_ID > public.asc
1030
+
1031
+ # On destination system
1032
+ gpg --import public.asc
1033
+ gpg --import private.asc
1034
+ ```
1035
+
1036
+ - Trust the imported key:
1037
+
1038
+ ```bash
1039
+ gpg --edit-key KEY_ID trust quit
1040
+ # Select trust level 5 (ultimate) for your own key
1041
+ ```
1042
+
1043
+ ---
1044
+
1045
+ ## References
1046
+
1047
+ - [GnuPG Official Website](https://gnupg.org/)
1048
+ - [GnuPG Official Documentation](https://gnupg.org/documentation/)
1049
+ - [GnuPG Download Page](https://gnupg.org/download/)
1050
+ - [GitHub: Signing Commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits)
1051
+ - [GitLab: Signing Commits with GPG](https://docs.gitlab.com/ee/user/project/repository/signed_commits/gpg.html)
1052
+ - [Homebrew GnuPG Formula](https://formulae.brew.sh/formula/gnupg)
1053
+ - [Chocolatey GnuPG Package](https://community.chocolatey.org/packages/gnupg)
1054
+ - [winget GnuPG Package](https://winget.run/pkg/GnuPG/GnuPG)
1055
+ - [AWS Documentation: GnuPG on Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/gnupg-minimal.html)
1056
+ - [Debian Wiki: GnuPG](https://wiki.debian.org/GnuPG)