@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.
- package/README.md +5 -5
- package/package.json +1 -1
- package/src/commands/install.js +374 -36
- package/src/installs/adobe-creative-cloud.js +527 -25
- package/src/installs/adobe-creative-cloud.md +605 -0
- package/src/installs/appcleaner.js +303 -26
- package/src/installs/appcleaner.md +699 -0
- package/src/installs/apt-transport-https.js +390 -0
- package/src/installs/apt-transport-https.md +678 -0
- package/src/installs/atomicparsley.js +624 -26
- package/src/installs/atomicparsley.md +795 -0
- package/src/installs/aws-cli.js +779 -26
- package/src/installs/aws-cli.md +727 -0
- package/src/installs/balena-etcher.js +688 -26
- package/src/installs/balena-etcher.md +761 -0
- package/src/installs/bambu-studio.js +912 -26
- package/src/installs/bambu-studio.md +780 -0
- package/src/installs/bash-completion.js +554 -23
- package/src/installs/bash-completion.md +833 -0
- package/src/installs/bash.js +399 -26
- package/src/installs/bash.md +993 -0
- package/src/installs/beyond-compare.js +585 -26
- package/src/installs/beyond-compare.md +813 -0
- package/src/installs/build-essential.js +511 -26
- package/src/installs/build-essential.md +977 -0
- package/src/installs/ca-certificates.js +618 -0
- package/src/installs/ca-certificates.md +937 -0
- package/src/installs/caffeine.js +490 -26
- package/src/installs/caffeine.md +839 -0
- package/src/installs/camtasia.js +577 -25
- package/src/installs/camtasia.md +762 -0
- package/src/installs/chatgpt.js +458 -26
- package/src/installs/chatgpt.md +814 -0
- package/src/installs/chocolatey.js +447 -0
- package/src/installs/chocolatey.md +661 -0
- package/src/installs/chrome-canary.js +472 -26
- package/src/installs/chrome-canary.md +641 -0
- package/src/installs/chromium.js +645 -26
- package/src/installs/chromium.md +838 -0
- package/src/installs/claude-code.js +558 -26
- package/src/installs/claude-code.md +1173 -0
- package/src/installs/curl.js +361 -26
- package/src/installs/curl.md +714 -0
- package/src/installs/cursor.js +561 -26
- package/src/installs/cursor.md +970 -0
- package/src/installs/dbschema.js +674 -26
- package/src/installs/dbschema.md +925 -0
- package/src/installs/dependencies.md +435 -0
- package/src/installs/development-tools.js +600 -0
- package/src/installs/development-tools.md +977 -0
- package/src/installs/docker.js +1010 -25
- package/src/installs/docker.md +1109 -0
- package/src/installs/drawio.js +1001 -26
- package/src/installs/drawio.md +795 -0
- package/src/installs/elmedia-player.js +328 -25
- package/src/installs/elmedia-player.md +556 -0
- package/src/installs/ffmpeg.js +870 -25
- package/src/installs/ffmpeg.md +852 -0
- package/src/installs/file.js +464 -0
- package/src/installs/file.md +987 -0
- package/src/installs/gemini-cli.js +793 -26
- package/src/installs/gemini-cli.md +1153 -0
- package/src/installs/git.js +382 -26
- package/src/installs/git.md +907 -0
- package/src/installs/gitego.js +931 -26
- package/src/installs/gitego.md +1172 -0
- package/src/installs/go.js +913 -26
- package/src/installs/go.md +958 -0
- package/src/installs/google-chrome.js +801 -25
- package/src/installs/google-chrome.md +862 -0
- package/src/installs/gpg.js +412 -73
- package/src/installs/gpg.md +1056 -0
- package/src/installs/homebrew.js +1015 -26
- package/src/installs/homebrew.md +988 -0
- package/src/installs/imageoptim.js +950 -26
- package/src/installs/imageoptim.md +1119 -0
- package/src/installs/installers.json +2297 -0
- package/src/installs/jq.js +382 -26
- package/src/installs/jq.md +809 -0
- package/src/installs/keyboard-maestro.js +701 -26
- package/src/installs/keyboard-maestro.md +825 -0
- package/src/installs/latex.js +771 -26
- package/src/installs/latex.md +1095 -0
- package/src/installs/lftp.js +338 -26
- package/src/installs/lftp.md +907 -0
- package/src/installs/lsb-release.js +346 -0
- package/src/installs/lsb-release.md +814 -0
- package/src/installs/messenger.js +829 -26
- package/src/installs/messenger.md +900 -0
- package/src/installs/microsoft-office.js +550 -26
- package/src/installs/microsoft-office.md +760 -0
- package/src/installs/microsoft-teams.js +782 -25
- package/src/installs/microsoft-teams.md +886 -0
- package/src/installs/node.js +886 -26
- package/src/installs/node.md +1153 -0
- package/src/installs/nordpass.js +698 -26
- package/src/installs/nordpass.md +921 -0
- package/src/installs/nvm.js +977 -26
- package/src/installs/nvm.md +1057 -0
- package/src/installs/openssh.js +734 -64
- package/src/installs/openssh.md +1056 -0
- package/src/installs/pandoc.js +644 -26
- package/src/installs/pandoc.md +1036 -0
- package/src/installs/pinentry.js +492 -26
- package/src/installs/pinentry.md +1142 -0
- package/src/installs/pngyu.js +851 -26
- package/src/installs/pngyu.md +896 -0
- package/src/installs/postman.js +781 -26
- package/src/installs/postman.md +940 -0
- package/src/installs/procps.js +425 -0
- package/src/installs/procps.md +851 -0
- package/src/installs/safari-tech-preview.js +355 -25
- package/src/installs/safari-tech-preview.md +533 -0
- package/src/installs/sfnt2woff.js +640 -26
- package/src/installs/sfnt2woff.md +795 -0
- package/src/installs/shellcheck.js +463 -26
- package/src/installs/shellcheck.md +1005 -0
- package/src/installs/slack.js +722 -25
- package/src/installs/slack.md +865 -0
- package/src/installs/snagit.js +566 -25
- package/src/installs/snagit.md +844 -0
- package/src/installs/software-properties-common.js +372 -0
- package/src/installs/software-properties-common.md +805 -0
- package/src/installs/spotify.js +858 -25
- package/src/installs/spotify.md +901 -0
- package/src/installs/studio-3t.js +803 -26
- package/src/installs/studio-3t.md +918 -0
- package/src/installs/sublime-text.js +780 -25
- package/src/installs/sublime-text.md +914 -0
- package/src/installs/superwhisper.js +687 -25
- package/src/installs/superwhisper.md +630 -0
- package/src/installs/tailscale.js +727 -26
- package/src/installs/tailscale.md +1100 -0
- package/src/installs/tar.js +389 -0
- package/src/installs/tar.md +946 -0
- package/src/installs/termius.js +780 -26
- package/src/installs/termius.md +844 -0
- package/src/installs/terraform.js +761 -26
- package/src/installs/terraform.md +899 -0
- package/src/installs/tidal.js +752 -25
- package/src/installs/tidal.md +864 -0
- package/src/installs/tmux.js +328 -26
- package/src/installs/tmux.md +1030 -0
- package/src/installs/tree.js +393 -26
- package/src/installs/tree.md +833 -0
- package/src/installs/unzip.js +460 -0
- package/src/installs/unzip.md +879 -0
- package/src/installs/vim.js +403 -26
- package/src/installs/vim.md +1040 -0
- package/src/installs/vlc.js +803 -26
- package/src/installs/vlc.md +927 -0
- package/src/installs/vscode.js +825 -26
- package/src/installs/vscode.md +1002 -0
- package/src/installs/wget.js +415 -0
- package/src/installs/wget.md +791 -0
- package/src/installs/whatsapp.js +710 -25
- package/src/installs/whatsapp.md +854 -0
- package/src/installs/winpty.js +352 -0
- package/src/installs/winpty.md +620 -0
- package/src/installs/woff2.js +535 -26
- package/src/installs/woff2.md +977 -0
- package/src/installs/wsl.js +572 -0
- package/src/installs/wsl.md +699 -0
- package/src/installs/xcode-clt.js +520 -0
- package/src/installs/xcode-clt.md +351 -0
- package/src/installs/xcode.js +542 -26
- package/src/installs/xcode.md +573 -0
- package/src/installs/yarn.js +806 -26
- package/src/installs/yarn.md +1074 -0
- package/src/installs/yq.js +636 -26
- package/src/installs/yq.md +944 -0
- package/src/installs/yt-dlp.js +683 -26
- package/src/installs/yt-dlp.md +946 -0
- package/src/installs/yum-utils.js +297 -0
- package/src/installs/yum-utils.md +648 -0
- package/src/installs/zoom.js +740 -25
- package/src/installs/zoom.md +884 -0
- package/src/scripts/README.md +567 -45
- package/src/scripts/STATUS.md +208 -0
- package/src/scripts/afk.js +395 -7
- package/src/scripts/backup-all.js +731 -9
- package/src/scripts/backup-source.js +711 -8
- package/src/scripts/brewd.js +373 -7
- package/src/scripts/brewi.js +505 -9
- package/src/scripts/brewr.js +512 -9
- package/src/scripts/brews.js +462 -9
- package/src/scripts/brewu.js +488 -7
- package/src/scripts/c.js +185 -7
- package/src/scripts/ccurl.js +325 -8
- package/src/scripts/certbot-crontab-init.js +488 -8
- package/src/scripts/certbot-init.js +641 -9
- package/src/scripts/ch.js +339 -7
- package/src/scripts/claude-danger.js +253 -8
- package/src/scripts/clean-dev.js +419 -8
- package/src/scripts/clear-dns-cache.js +525 -7
- package/src/scripts/clone.js +417 -7
- package/src/scripts/code-all.js +420 -7
- package/src/scripts/count-files.js +195 -8
- package/src/scripts/count-folders.js +195 -8
- package/src/scripts/count.js +248 -8
- package/src/scripts/d.js +203 -7
- package/src/scripts/datauri.js +373 -8
- package/src/scripts/delete-files.js +363 -7
- package/src/scripts/docker-clean.js +410 -8
- package/src/scripts/dp.js +426 -7
- package/src/scripts/e.js +375 -9
- package/src/scripts/empty-trash.js +497 -7
- package/src/scripts/evm.js +428 -9
- package/src/scripts/fetch-github-repos.js +441 -10
- package/src/scripts/get-channel.js +329 -8
- package/src/scripts/get-course.js +384 -11
- package/src/scripts/get-dependencies.js +290 -9
- package/src/scripts/get-folder.js +783 -10
- package/src/scripts/get-tunes.js +411 -10
- package/src/scripts/get-video.js +352 -9
- package/src/scripts/git-backup.js +561 -9
- package/src/scripts/git-clone.js +477 -9
- package/src/scripts/git-pup.js +303 -7
- package/src/scripts/git-push.js +380 -8
- package/src/scripts/h.js +607 -9
- package/src/scripts/hide-desktop-icons.js +483 -7
- package/src/scripts/hide-hidden-files.js +522 -7
- package/src/scripts/install-dependencies-from.js +440 -9
- package/src/scripts/ips.js +647 -10
- package/src/scripts/iso.js +354 -8
- package/src/scripts/killni.js +561 -7
- package/src/scripts/ll.js +451 -8
- package/src/scripts/local-ip.js +310 -8
- package/src/scripts/m.js +508 -8
- package/src/scripts/map.js +293 -8
- package/src/scripts/mkd.js +287 -7
- package/src/scripts/ncu-update-all.js +441 -8
- package/src/scripts/nginx-init.js +702 -12
- package/src/scripts/npmi.js +366 -7
- package/src/scripts/o.js +495 -8
- package/src/scripts/org-by-date.js +321 -7
- package/src/scripts/p.js +208 -7
- package/src/scripts/packages.js +313 -8
- package/src/scripts/path.js +209 -7
- package/src/scripts/ports.js +582 -8
- package/src/scripts/q.js +290 -8
- package/src/scripts/refresh-files.js +378 -10
- package/src/scripts/remove-smaller-files.js +500 -8
- package/src/scripts/rename-files-with-date.js +517 -9
- package/src/scripts/resize-image.js +523 -9
- package/src/scripts/rm-safe.js +653 -8
- package/src/scripts/s.js +525 -9
- package/src/scripts/set-git-public.js +349 -7
- package/src/scripts/show-desktop-icons.js +459 -7
- package/src/scripts/show-hidden-files.js +456 -7
- package/src/scripts/tpa.js +265 -8
- package/src/scripts/tpo.js +264 -7
- package/src/scripts/u.js +489 -7
- package/src/scripts/vpush.js +422 -8
- package/src/scripts/y.js +267 -7
- package/src/utils/common/os.js +94 -2
- 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)
|