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:

bash
gpg --version

Output yang Dihasilkan (dua baris pertama):

text
gpg (GnuPG) 2.4.7
libgcrypt 1.11.0

GPG 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:

bash
mkdir -p work/sandbox/lampiran/gpg/gpg-rumah
chmod 700 work/sandbox/lampiran/gpg/gpg-rumah
export GNUPGHOME=work/sandbox/lampiran/gpg/gpg-rumah

Izin 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:

text
%no-protection
Key-Type: eddsa
Key-Curve: Ed25519
Key-Usage: sign
Name-Real: Budi Santoso
Name-Email: [email protected]
Expire-Date: 0
%commit

Baris 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:

bash
gpg --batch --gen-key kunci-param.txt

Output yang Dihasilkan:

text
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:

bash
gpg --list-secret-keys --keyid-format long

Output yang Dihasilkan:

text
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):

bash
git config user.signingkey C1E1AF5944098798
git config commit.gpgsign true

Nilainya tersimpan sebagai konfigurasi lokal — buktinya:

bash
git config --local --get-regexp "signingkey|gpgsign"

Output yang Dihasilkan:

text
user.signingkey C1E1AF5944098798
commit.gpgsign true

Kunci 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):

bash
git commit -S -m "commit pertama ditandatangani"

Output yang Dihasilkan:

text
[main (root-commit) 1f1b42d] commit pertama ditandatangani
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Tanda tangannya tidak terlihat di keluaran commit — ia tertanam di dalam objek commit. Bukti keberadaannya muncul lewat git log --show-signature:

bash
git log --show-signature -1

Output yang Dihasilkan:

text
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 ditandatangani

Baris 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:

bash
gpg --export --armor C1E1AF5944098798

Output yang Dihasilkan (dipotong):

text
-----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 .