GPG key — commitlarni imzolash, verified badge

~15 daq · Git · Amaliy va Professional mavzular

Muammodan boshlaylik

3-darsda aytilgan edi: Git user.name va user.email ni tekshirmaydi. Sinab ko'ring:

git config user.name "Linus Torvalds"
git config user.email "torvalds@linux-foundation.org"
git commit -m "Men Linus man"

Commit tayyor — va GitHub uni Linus ning profil rasmi bilan ko'rsatadi. Har kim istalgan odam nomidan commit qila oladi. Kimdir sizning nomingizdan zararli kod yozib, push qilsa (masalan, ochiq loyihaga PR orqali) — tarixda u sizniki bo'lib ko'rinadi.

Haqiqiy muallifni isbotlash — kriptografik imzo.


Imzolangan commit

Imzolangan commit — yopiq kalit bilan "muhrlangan". GitHub uni ochiq kalit bilan tekshiradi va belgi qo'yadi:

a3f9c2b  feat: savat qo'shildi     Otabek Hasanov    [Verified]
9f8e7d6  fix: narx                 Otabek Hasanov    [Unverified]
  • Verified ✅ — imzo to'g'ri, kalit shu GitHub hisobiga tegishli
  • Unverified ⚠️ — imzo bor, lekin tekshirib bo'lmadi
  • Belgi yo'q — imzolanmagan (oddiy holat)

Imzolashning ikki usuli: SSH kalit (oddiyroq) va GPG kalit (klassik).


1-usul: SSH kalit bilan imzolash (tavsiya)

Git 2.34+ va GitHub SSH kalitlar bilan imzolashni qo'llab-quvvatlaydi. 50-darsdagi kalitingizdan foydalanish mumkin:

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true

GitHub → Settings → SSH and GPG keys → New SSH key → Key type: Signing Key → o'sha .pub faylning mazmuni.

[!INFO] Bir xil ochiq kalitni GitHub ga ikki marta qo'shish kerak: bir marta "Authentication Key" (push uchun, 4-dars), bir marta "Signing Key" (imzo uchun). Bular turli maqsadlar.

Endi har bir commit avtomatik imzolanadi:

git commit -m "feat: imzolangan commit"
git log --show-signature -1

Lokal tekshirish uchun — ishonchli kalitlar ro'yxati:

echo "otabek@example.com $(cat ~/.ssh/id_ed25519.pub)" >> ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
git log --show-signature -1
Good "git" signature for otabek@example.com with ED25519 key SHA256:...

2-usul: GPG kalit

GPG (GNU Privacy Guard) — imzolash va shifrlashning klassik standarti. Linux yadrosi kabi eski loyihalar va ba'zi kompaniyalar talab qiladi.

O'rnatish

  • Windows — Git for Windows tarkibida bor (Git Bash da gpg), yoki Gpg4win
  • macOS — brew install gnupg pinentry-mac
  • Linux — odatda o'rnatilgan

Kalit yaratish

gpg --full-generate-key
  • Tur: ECC (sign and encrypt) → Curve 25519 (yoki RSA 4096)
  • Muddat: masalan 2y (2 yil — muddati tugagach uzaytirish mumkin)
  • Ism va email — GitHub dagi tasdiqlangan email bilan bir xil
  • Passphrase

Kalit ID sini topish

gpg --list-secret-keys --keyid-format=long
sec   ed25519/3AA5C34371567BD2 2026-11-06 [SC] [expires: 2028-11-06]
      ...
uid                 [ultimate] Otabek Hasanov <otabek@example.com>

Kalit ID — 3AA5C34371567BD2.

GitHub ga qo'shish

gpg --armor --export 3AA5C34371567BD2

-----BEGIN PGP PUBLIC KEY BLOCK----- dan -----END ...----- gacha nusxalang → GitHub → Settings → SSH and GPG keys → New GPG key.

Git ni sozlash

git config --global user.signingkey 3AA5C34371567BD2
git config --global commit.gpgsign true
git config --global tag.gpgsign true

Windows da Git Bash dagi gpg ni ko'rsatish kerak bo'lishi mumkin:

git config --global gpg.program "C:/Program Files/Git/usr/bin/gpg.exe"

Imzolash bilan ishlash

git commit -S -m "..."          # bitta commit ni imzolash (gpgsign o'chiq bo'lsa)
git tag -s v2.5.0 -m "..."      # imzolangan teg (36-dars)
git log --show-signature        # imzolarni ko'rsatish
git verify-commit a3f9c2b       # bitta commit ni tekshirish
git verify-tag v2.5.0

Eski commitlarni imzolash — tarixni qayta yozish (17-dars):

git rebase --exec 'git commit --amend --no-edit -S' main

Faqat push qilinmagan commitlar uchun.


Vigilant mode va majburiy imzo

Vigilant mode

GitHub → Settings → SSH and GPG keys → Flag unsigned commits as unverified. Endi sizning nomingizdagi barcha imzosiz commitlar "Unverified" deb belgilanadi — kimdir sizning nomingizdan commit qilsa, darhol ko'rinadi.

Branch protection

Repozitoriy → Settings → Branches (yoki Rules) → Require signed commits. main ga faqat imzolangan commitlar tushadi. Moliya, xavfsizlik va ochiq infratuzilma loyihalarida keng tarqalgan.

[!WARNING] GitHub veb-interfeysi orqali qilingan commitlar (PR merge, fayl tahrirlash) — GitHub ning o'z kaliti bilan avtomatik imzolanadi va "Verified" bo'ladi. Lekin "Rebase and merge" (23-dars) commitlarni qayta yaratadi va imzolar yo'qoladi — imzo majburiy bo'lsa, "Squash" yoki "Merge commit" ishlating.


Muammolar

Xato Yechim
error: gpg failed to sign the data echo "test" | gpg --clearsign — GPG ishlayaptimi? Passphrase oynasi chiqmayaptimi?
GPG passphrase so'ramayapti (terminalda qotib qoladi) export GPG_TTY=$(tty) — ~/.bashrc ga qo'shing
GitHub da "Unverified" Kalitdagi email GitHub dagi tasdiqlangan email bilan mosmi? Commit email i?
Kalit muddati tugadi gpg --edit-key ID → expire → yangi muddat → GitHub ga qayta eksport

Nima uchun shunday?

Nima uchun commit muallifi oddiy matn — Git nega buni boshidan tekshirmaydi?

Chunki Git taqsimlangan tizim (1-dars): markaziy server yo'q, va commit lar internetsiz, istalgan joyda yaratiladi. "Kim" ekanini tekshiradigan markaziy hokimiyat yo'q — shuning uchun Git muallifni shunchaki yozib qo'yadi. Imzo bu muammoni markaziy serversiz hal qiladi: matematika orqali. Faqat yopiq kalit egasi to'g'ri imzo yarata oladi, va istalgan kishi ochiq kalit bilan uni tekshira oladi — GitHub ham, siz ham, o'n yildan keyin auditorlar ham. Ochiq kodli ta'minot zanjiri hujumlari (kimdir mashhur kutubxonaga zararli kod kiritishi) ko'payib borayotgan bugungi kunda imzolangan commit va teglar tobora majburiy talabga aylanmoqda.


Xulosa

Eslab qoling:

  • user.name/email — tekshirilmaydi; har kim har kim nomidan commit qila oladi
  • Imzo — muallifni kriptografik isbotlash; GitHub da Verified
  • SSH bilan (oddiy): gpg.format ssh, user.signingkey ~/.ssh/id_ed25519.pub, GitHub ga "Signing Key"
  • GPG bilan: gpg --full-generate-key → ID → --armor --export → GitHub; email mos bo'lsin
  • commit.gpgsign true, tag.gpgsign true — avtomatik imzolash
  • git log --show-signature, git verify-commit, git verify-tag
  • Vigilant mode — imzosizlar "Unverified"; branch protection — "Require signed commits"
  • GPG qotib qolsa — export GPG_TTY=$(tty)

Keyingi dars

52-dars: .gitattributes — fayl turlari, line ending, diff sozlash