SSH key — yaratish, GitHub ga ulash, agent sozlash

~15 daq · Git · Amaliy va Professional mavzular

Muammodan boshlaylik

4-darsda SSH kalitni sozlagansiz — u ishlayapti. Lekin endi yangi savollar:

  • Ikkita GitHub hisobingiz bor — shaxsiy va ish. Ikkalasiga bitta kalitni qo'shib bo'lmaydi
  • Kalitga passphrase qo'ydingiz — endi har bir git push da so'rayapti
  • Yangi noutbuk oldingiz — eski kalitni ko'chiraymi yoki yangisini yarataymi?
  • Permission denied (publickey) — nima noto'g'ri?

Bu dars — SSH kalitlar bilan kundalik ishning amaliy tomonlari.


Kalit turi va yaratish — eslatma

ssh-keygen -t ed25519 -C "otabek@noutbuk-2026"
Tur Holat
ed25519 ✅ Tavsiya etiladi — qisqa, tez, xavfsiz
rsa (4096) Eski tizimlar uchun; 2048 dan kam — yo'q
dsa ❌ Eskirgan, GitHub qabul qilmaydi

-C izohi — kalit qaysi qurilmadan ekanini bildirsin. GitHub da kalitlar ro'yxatiga qaraganingizda "noutbuk-2026", "ish-kompyuter" — qaysi birini o'chirish kerakligi aniq.

[!TIP] Har bir qurilma uchun alohida kalit yarating — yopiq kalitni kompyuterlar orasida ko'chirmang. Noutbuk yo'qolsa — faqat uning kalitini GitHub dan o'chirasiz, qolganlari ishlashda davom etadi.


Passphrase va ssh-agent

Passphrase — yopiq kalit faylini shifrlaydi. Noutbuk o'g'irlansa ham, kalitni passphrase siz ishlatib bo'lmaydi. Lekin har push da yozish — noqulay. Yechim — ssh-agent: passphrase bir marta kiritiladi, agent kalitni xotirada ushlab turadi.

macOS

# ~/.ssh/config
Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Passphrase macOS Keychain da saqlanadi — qayta yuklashdan keyin ham so'ralmaydi.

Windows

PowerShell ni administrator sifatida:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Git ham shu agentni ishlatishi uchun:

git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"

Linux / Git Bash

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l                         # agentdagi kalitlar

Ko'p Linux ish stollarida agent avtomatik ishlaydi. Git Bash da — ~/.bashrc ga agentni ishga tushirish qo'shiladi (Linux kursi, 34-dars).


Bir nechta GitHub hisobi

GitHub bitta kalitni faqat bitta hisobga qo'shishga ruxsat beradi. Shaxsiy va ish hisoblari uchun — ikki kalit:

ssh-keygen -t ed25519 -C "otabek@shaxsiy" -f ~/.ssh/id_shaxsiy
ssh-keygen -t ed25519 -C "otabek@kompaniya" -f ~/.ssh/id_ish

Har birini tegishli GitHub hisobiga qo'shing. Keyin ~/.ssh/config:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_shaxsiy
    IdentitiesOnly yes

Host github-ish
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ish
    IdentitiesOnly yes
  • IdentitiesOnly yes — faqat ko'rsatilgan kalitni sinash (agentdagi boshqa kalitlarni emas)

Ish repozitoriylari uchun — github-ish nomi bilan:

git clone git@github-ish:kompaniya/dokon.git

Mavjud repozitoriyda:

git remote set-url origin git@github-ish:kompaniya/dokon.git

Email ni ham avtomatik almashtirish

Ish loyihalari bitta papkada bo'lsa — ~/.gitconfig da shartli sozlama:

[user]
    name = Otabek Hasanov
    email = otabek@shaxsiy.uz

[includeIf "gitdir:~/ish/"]
    path = ~/.gitconfig-ish
# ~/.gitconfig-ish
[user]
    email = otabek@kompaniya.uz
[core]
    sshCommand = ssh -i ~/.ssh/id_ish -o IdentitiesOnly=yes

Endi ~/ish/ ichidagi har bir repozitoriy avtomatik ish email i va ish kaliti bilan ishlaydi (3-dars: config darajalari).


Debug: Permission denied (publickey)

ssh -vT git@github.com

-v — batafsil log. Qarash kerak bo'lgan qatorlar:

debug1: Offering public key: /home/otabek/.ssh/id_ed25519 ED25519 SHA256:...
debug1: Server accepts key: ...                    ← ✅ kalit qabul qilindi
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.     ← ❌ hech bir kalit mos kelmadi

Tipik sabablar:

Sabab Tekshirish / yechim
Ochiq kalit GitHub ga qo'shilmagan GitHub → Settings → SSH keys
Noto'g'ri kalit taklif qilinyapti -v da qaysi fayl; ~/.ssh/config da IdentityFile
Agent bo'sh ssh-add -l; ssh-add ~/.ssh/id_ed25519
Ruxsatlar juda ochiq chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519 (Linux kursi, 20-dars)
Remote HTTPS da, SSH emas git remote -v; set-url bilan SSH ga
Kalit boshqa hisobga qo'shilgan ssh -T git@github.com — "Hi kim!"

22-port yopiq tarmoqda

Ba'zi ofis va jamoat Wi-Fi tarmoqlari 22-portni bloklaydi. GitHub SSH ni 443-port orqali ham qabul qiladi:

Host github.com
    HostName ssh.github.com
    Port 443
    User git

Deploy kalitlari

Server faqat bitta repozitoriyni o'qishi kerak (masalan, git pull bilan deploy): shaxsiy kalitingizni serverga qo'ymang — u barcha repozitoriylaringizga kirish beradi.

Repozitoriy → Settings → Deploy keys → Add deploy key: serverda yaratilgan kalitning ochiq qismi. Standart holatda — faqat o'qish. Bitta kalit — bitta repozitoriy.


Kalitni almashtirish

  • Kalit sizib chiqqan yoki qurilma yo'qolgan → GitHub dan darhol o'chiring
  • Xodim ketdi → tashkilotdan chiqaring; deploy kalitlarini yangilang
  • Muntazam (masalan, yiliga bir marta) — yangi kalit, eskisini o'chirish

GitHub → Settings → SSH keys — har bir kalit uchun "Last used" ko'rsatiladi: uzoq ishlatilmaganlarini o'chiring.


Nima uchun shunday?

Nima uchun har bir qurilma uchun alohida kalit — bitta kalitni hamma joyga nusxalash oddiyroq emasmi?

Chunki kalit — identifikatsiya va bekor qilish birligi. Bitta kalit beshta qurilmada bo'lsa: bittasi yo'qolganda kalitni o'chirasiz — va qolgan to'rttasi ham ishlamay qoladi, ularning hammasiga yangi kalit tarqatish kerak. Bundan tashqari, yopiq kalit qancha ko'p joyda bo'lsa — sizib chiqish ehtimoli shuncha yuqori (zaxira nusxalar, bulut sinxronizatsiyasi, eski disklar). Alohida kalitlar bilan zarar aniq chegaralangan: noutbuk yo'qoldi — "noutbuk-2026" kaliti o'chirildi, boshqa hech narsa o'zgarmadi. Bu — eng kam imtiyoz va izolyatsiya tamoyillarining (Linux va Docker kurslari) yana bir ko'rinishi.


Xulosa

Eslab qoling:

  • ssh-keygen -t ed25519 -C "kim@qurilma" — har qurilmaga alohida kalit
  • Passphrase + ssh-agent: macOS — Keychain, Windows — ssh-agent xizmati, Linux — ssh-add
  • Bir nechta hisob: har biriga kalit + ~/.ssh/config da Host github-ish + IdentitiesOnly yes
  • includeIf "gitdir:~/ish/" — papka bo'yicha email va kalit
  • Debug: ssh -vT git@github.com; ruxsatlar 700/600
  • 22-port yopiq — ssh.github.com:443
  • Server uchun — Deploy keys (bitta repo, faqat o'qish)
  • Yo'qolgan/sizgan kalit — darhol o'chirish

Keyingi dars

51-dars: GPG key — commitlarni imzolash, verified badge