SSH key — yaratish, GitHub ga ulash, agent sozlash
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 pushda 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/configdaHost 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