Kunci SSH membuktikan bahwa mesin kita berhak mendorong ke repository; tanda tangan GPG membuktikan hal yang berbeda — bahwa commit itu lahir dari tangan pemiliknya. Platform seperti GitHub dan GitLab memeriksa tanda tangan ini dan menempelkan lencana “Verified” pada commit yang tandanya cocok dengan kunci publik terdaftar, sehingga penulis commit tidak bisa dipalsukan. Chapter ini menyiapkan GPG dari nol secara nyata di sandbox: membuat kunci lewat berkas parameter, mengambil ID-nya, mendaftarkannya ke Git, menandatangani commit sungguhan, lalu mengekspor kunci publik untuk platform.
Memeriksa Versi GPG #
Langkah pertama memastikan GPG terpasang:
gpg --versionOutput yang Dihasilkan (dua baris pertama):
gpg (GnuPG) 2.4.7
libgcrypt 1.11.0GPG 2.4.7 itulah yang berjalan di mesin latihan Course; di sebagian besar distribusi Linux paket gnupg sudah hadir bawaan. Nomor versi layak dicatat: perilaku bawaan GPG berbeda cukup jauh antar generasi, dan panduan lama untuk GPG 1.x kerap menyesatkan.
Rumah Kunci: GNUPGHOME #
GPG menyimpan kunci di sebuah direktori rumah, bawaannya ~/.gnupg. Variabel lingkungan GNUPGHOME memindahkan rumah itu ke lokasi lain — dan inilah mekanisme yang dipakai sandbox agar kunci latihan tidak menyentuh ~/.gnupg sungguhan:
mkdir -p work/sandbox/lampiran/gpg/gpg-rumah
chmod 700 work/sandbox/lampiran/gpg/gpg-rumah
export GNUPGHOME=work/sandbox/lampiran/gpg/gpg-rumahIzin 700 bukan formalitas — direktori rumah yang terlalu terbuka membuat GPG memperingatkan unsafe permissions on homedir dan menolak bekerja. Di mesin kita, perintah-perintah berikut cukup dijalankan tanpa GNUPGHOME; GPG otomatis memakai ~/.gnupg.
Membuat Kunci lewat Berkas Parameter #
Jalur interaktifnya, gpg --full-generate-key, menanya jenis kunci, masa berlaku, identitas, dan passphrase. Jalur kedua yang bisa diuji ulang: berkas parameter yang menjawab semuanya sekaligus — simpan sebagai kunci-param.txt:
%no-protection
Key-Type: eddsa
Key-Curve: Ed25519
Key-Usage: sign
Name-Real: Budi Santoso
Name-Email: [email protected]
Expire-Date: 0
%commitBaris demi barisnya: %no-protection membuat kunci tanpa passphrase — khusus latihan otomatis; pada kunci sungguhan, hilangkan baris ini agar GPG menanyakan passphrase. Key-Type: eddsa dengan Key-Curve: Ed25519 memilih algoritma tanda tangan modern yang ringkas; Key-Usage: sign membatasi kunci untuk menandatangani saja; Name-Real dan Name-Email menjadi identitas yang terbaca saat verifikasi — email di sini sebaiknya sama dengan email commit kita di platform; Expire-Date: 0 berarti tanpa kedaluwarsa; %commit menutup berkas dan memicu pembuatan. Jalankan:
gpg --batch --gen-key kunci-param.txtOutput yang Dihasilkan:
gpg: keybox '/home/z/my-project/tutorial-extracted/work/sandbox/lampiran/gpg/gpg-rumah/pubring.kbx' created
gpg: /home/z/my-project/tutorial-extracted/work/sandbox/lampiran/gpg/gpg-rumah/trustdb.gpg: trustdb created
gpg: directory '/home/z/my-project/tutorial-extracted/work/sandbox/lampiran/gpg/gpg-rumah/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/z/my-project/tutorial-extracted/work/sandbox/lampiran/gpg/gpg-rumah/openpgp-revocs.d/F97D58EED2AB70FB4C8D28F0C1E1AF5944098798.rev'Tiga baris pertama mencatat berkas-berkas rumah kunci yang baru lahir — pubring.kbx wadah kunci publik, trustdb.gpg basis data kepercayaan. Baris terakhir menyimpan sertifikat pencabutan: kartu “kunci ini tidak dipercaya lagi” yang berguna bila kunci privat hilang — simpan berkas .rev itu baik-baik. Jalur pada keluaran menyesuaikan lokasi GNUPGHOME di mesin masing-masing.
Mengambil ID Kunci #
Git tidak memanggil kunci dengan fingerprint penuh, melainkan ID panjangnya:
gpg --list-secret-keys --keyid-format longOutput yang Dihasilkan:
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/z/my-project/tutorial-extracted/work/sandbox/lampiran/gpg/gpg-rumah/pubring.kbx
--------------------------------------------------------------------------------
sec ed25519/C1E1AF5944098798 2026-10-13 [SC]
F97D58EED2AB70FB4C8D28F0C1E1AF5944098798
uid [ultimate] Budi Santoso <[email protected]>Cara membacanya: baris sec adalah secret key — ed25519 algoritmanya, C1E1AF5944098798 ID panjang yang akan didaftarkan ke Git, [SC] kemampuan menandatangani dan mensertifikasi, dan baris di bawahnya fingerprint penuh. Baris uid menampilkan identitas kunci; label [ultimate] wajar — pemiliknya baru saja membuat kunci itu sendiri.
Mendaftarkan Kunci ke Git #
Dua konfigurasi ini hidup di dalam repository latihan (tanpa --global; saat yakin, angkat ke global agar semua repo ikut):
git config user.signingkey C1E1AF5944098798
git config commit.gpgsign trueNilainya tersimpan sebagai konfigurasi lokal — buktinya:
git config --local --get-regexp "signingkey|gpgsign"Output yang Dihasilkan:
user.signingkey C1E1AF5944098798
commit.gpgsign trueKunci pertama memberi tahu Git kunci mana yang dipakai; kunci kedua membuat Git menandatangani setiap commit secara otomatis tanpa perlu flag -S.
Uji: Commit Bertanda Tangan #
Saatnya ujian sungguhan — commit dengan flag -S eksplisit (beri bantalan ganda; dengan commit.gpgsign true, flag ini teknisnya redundan):
git commit -S -m "commit pertama ditandatangani"Output yang Dihasilkan:
[main (root-commit) 1f1b42d] commit pertama ditandatangani
1 file changed, 1 insertion(+)
create mode 100644 README.mdTanda tangannya tidak terlihat di keluaran commit — ia tertanam di dalam objek commit. Bukti keberadaannya muncul lewat git log --show-signature:
git log --show-signature -1Output yang Dihasilkan:
commit 1f1b42d8df23695ef11f7888e80b7dde35924772
gpg: Signature made Tue Oct 13 18:55:42 2026 UTC
gpg: using EDDSA key F97D58EED2AB70FB4C8D28F0C1E1AF5944098798
gpg: Good signature from "Budi Santoso <[email protected]>" [ultimate]
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 09:00:00 2026 +0700
commit pertama ditandatanganiBaris Good signature adalah kecocokan yang dicari: tanda tangan diverifikasi dengan kunci yang kita pegang sendiri. Tanda tangan GPG membubuhkan waktu pembuatannya, jadi hash commit bertanda tangan berbeda setiap kali dibuat ulang — termasuk di mesin kita. Alur yang sama bekerja untuk menandatangani tag, seperti yang dipraktikkan di Menandatangani Commit dan Tag
.
Mengekspor Kunci Publik untuk Platform #
Platform memverifikasi tanda tangan dengan kunci publik kita, jadi kunci itu perlu didaftarkan. Ekspor dalam format teks:
gpg --export --armor C1E1AF5944098798Output yang Dihasilkan (dipotong):
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEas5+GRYJKwYBBAHaRw8BAQdAa48wbeGgMYV2e/8xd3xTVgAoi8kt17hbwUJv
OyP7Zqq0H0J1ZGkgU2FudG9zbyA8YnVkaUBleGFtcGxlLmNvbT6IkAQTFgoAOBYh
BPl9WO7Sq3D7TI0o8MHhr1lECYeYBQJqzn4ZAhsDBQsJCAcCBhUKCQgLAgQWAgMB
=iokb
-----END PGP PUBLIC KEY BLOCK-----Salin seluruh blok — dari baris BEGIN sampai END — lalu tempel di GitHub melalui Settings → SSH and GPG keys → New GPG key; GitLab menempatkannya di profil → GPG Keys. Panduan resminya, termasuk syarat email kunci harus cocok dengan email akun, ada di dokumentasi GitHub
. Commit yang ter-push setelah itu memperoleh lencana “Verified” di riwayat platform.
Perkakas di mesin kini lengkap: terminal nyaman, editor terpasang, kunci SSH untuk akses, dan kunci GPG untuk tanda tangan. Tinggal satu yang belum ada: rumah untuk kode kita di platform — akun dan repository pertama. Lanjut ke Menyiapkan GitHub .