IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari25/36-dars22 daqiqa
Mundarija (36)

SSH kalit va GitHub autentifikatsiyasi: ssh-keygen, ssh-agent va HTTPS token

Qisqacha: GitHub endi Git uchun oddiy parolni qabul qilmaydi. Ikki yo'l bor. HTTPS: Windows'da Git Credential Manager brauzer orqali bir marta kirib, qolganini o'zi eslab qoladi. SSH: ssh-keygen -t ed25519 bilan kalit juftini yaratasiz, ochiq kalitni GitHub'ga qo'shasiz va ssh -T git@github.com bilan tekshirasiz. Maxfiy kalit va token — parol bilan teng, ularni hech kimga bermang.

Bu darsda

  • GitHub nega parol emas, kalit yoki token so'rashini tushuntira olasiz.
  • HTTPS yo'lini — Git Credential Manager va fine-grained tokenni — qachon ishlatishni bilasiz.
  • ssh-keygen bilan ed25519 kalit yaratib, ochiq va maxfiy kalitni farqlay olasiz.
  • ssh-agent va ssh-add bilan kalit parolini har safar yozmaslikni sozlaysiz.
  • Ochiq kalitni GitHub'ga qo'shib, ssh -T git@github.com natijasini o'qiysiz.
  • Bitta kompyuterda ikki GitHub akkaunti uchun ~/.ssh/config yozasiz.

Oldin bilishingiz kerak: Git'ni o'rnatish va birinchi sozlash, Muhit o'zgaruvchilari, PATH va shell sozlamalari, Ish joyini tayyorlash va raqamli gigiyena.

1. Nega bu kerak?

Oldingi darslarda Git faqat kompyuteringizda ishladi. Keyingi darsda «Bahor» va portfolio'ni GitHub'ga yuborasiz. GitHub esa birinchi navbatda bitta savol beradi: "Siz kimsiz va bu repoga yozishga haqqingiz bormi?"

Git'ni o'rnatish darsida bilgan edingiz: Git uchun GitHub parolingiz bilan kirish endi ishlamaydi. GitHub hujjati buni aniq yozadi — parol bilan autentifikatsiya olib tashlangan, o'rniga xavfsizroq usullar bor. Sabab oddiy: parol ko'p joyda takrorlanadi, o'g'irlanadi va uni cheklab bo'lmaydi.

Autentifikatsiya (authentication) — "siz aynan o'zingiz ekaningizni isbotlash". Uyingiz eshigini o'ylang. Kalit bo'lsa — kirasiz. Mehmonga vaqtinchalik kalit berishingiz mumkin, keyin uni qaytarib olasiz. GitHub ham shunday ishlaydi: parol o'rniga kalit yoki token beriladi va ularni istalgan payt bekor qilish mumkin.

Ikki yo'l bor:

flowchart TD
  A["git push"] --> B{"Repo manzili<br/>qanday?"}
  B -->|"https://github.com/..."| C["HTTPS"]
  B -->|"git@github.com:..."| D["SSH"]
  C --> E["Git Credential Manager<br/>yoki token"]
  D --> F["SSH kalit jufti"]
  E --> G["GitHub: ruxsat"]
  F --> G

Nimaga qarang: qaysi yo'l ishlashini repo manzili belgilaydi. Bir xil repoga ikkala yo'l bilan ham ulanish mumkin — faqat manzil shakli boshqacha.

2. Ikki yo'l: HTTPS va SSH

HTTPS SSH
Manzil https://github.com/login/bahor.git git@github.com:login/bahor.git
Nima bilan GCM yoki token Kalit jufti
Sozlash Windows'da tayyor 4–5 buyruq
Port 443 (har joyda ochiq) 22 (ba'zi tarmoqda yopiq)

GitHub hujjatiga ko'ra, HTTPS manzillar hamma repolarda bor va himoya devori (firewall) yoki proxy (ofis tarmog'idagi oraliq server) ortida ham ishlaydi. Sababi — 443-port: brauzer saytlarni shu port orqali ochadi, shuning uchun uni deyarli hech kim yopmaydi. SSH manzillar uchun kompyuteringizda kalit jufti yaratib, ochiq kalitni GitHub akkauntingizga qo'shish kerak.

Bu darsda ikkalasini ham ko'ramiz. Kursda asosiy yo'l — HTTPS va Git Credential Manager: Windows'da u allaqachon sozlangan. SSH esa serverlar bilan ishlashda albatta kerak bo'ladi, shuning uchun uni hozirdan o'rganib qo'yamiz.

Tekshirib ko'ring: Hamkasbingiz git@github.com:jamoa/sayt.git manzilini yubordi. Bu qaysi yo'l va sizga nima kerak bo'ladi?

Javob

SSH. git@ bilan boshlanib, : bilan ajratilgan manzil — SSH shakli. Kompyuteringizda kalit jufti bo'lishi va ochiq kalitingiz GitHub akkauntingizga qo'shilgan bo'lishi kerak. Xohlasangiz, xuddi shu reponi HTTPS manzili bilan ham olsa bo'ladi: https://github.com/jamoa/sayt.git.

3. HTTPS: Git Credential Manager va token

3.1 GCM — Windows'da tayyor yo'l

Git'ni o'rnatish darsida Git Credential Manager (GCM) bilan tanishgan edingiz. Tekshiramiz:

bash
git config --show-scope --get-all credential.helper
git credential-manager --version
text
system	manager
2.7.3+5fa7116896c82164996a609accd1c5ad90fe730a

system manager — GCM yoqilgan. GitHub hujjati bo'yicha u shunday ishlaydi: HTTPS orqali birinchi marta kirish kerak bo'lganda, Git brauzer oynasini ochadi. GitHub'ga kirasiz va ruxsat berasiz. Ikki bosqichli himoya (2FA) yoqilgan bo'lsa, uni ham o'tasiz. Keyin GCM kirish ma'lumotini Windows Credential Manager ga saqlaydi va boshqa so'ramaydi.

Keyingi darsda birinchi marta git push qilganingizda aynan shu oyna chiqadi. Bir marta kirasiz — keyingi push'larda terminal hech narsa so'ramaydi.

Maslahat: Git for Windows'ni doim yangilab turing. GitHub hujjati eng kamida 2.29 versiyani tavsiya qiladi — GitHub bilan brauzer orqali kirish (OAuth) shundan boshlab ishlaydi. Sizda 2.54 — muammo yo'q.

Noto'g'ri ma'lumot saqlanib qolsa. Masalan, boshqa akkaunt bilan kirib qo'ydingiz. GitHub hujjati bo'yicha: Windows Boshqaruv paneli → User Accounts → Credential Manager → GitHub yozuvini topib, o'chirasiz. Keyingi git push da Git yana brauzer oynasini ochadi.

3.2 Token — parol o'rnidagi maxsus kalit

GCM bo'lmagan joyda (masalan Linux serverda yoki skriptda) HTTPS uchun shaxsiy kirish tokeni kerak. Token (personal access token, PAT) — GitHub sizga beradigan uzun maxfiy satr. U parol o'rnida ishlaydi, lekin ikkita afzalligi bor: muddati tugaydi va faqat siz ruxsat bergan ishni qila oladi.

GitHub ikki xil token beradi va fine-grained (aniq ruxsatli) tokenni tavsiya qiladi. Undagi har token bitta egasiga va tanlangan repolarga cheklanadi, ruxsatlari ham aniq tanlanadi.

Yaratish tartibi (docs.github.com, 2026-yil sentyabr holati):

  1. O'ng yuqoridagi profil rasmingiz → Settings.
  2. Chap menyuda Developer settings.
  3. Personal access tokens → Fine-grained tokens → Generate new token.
  4. Token name — nom, Expiration — muddat (masalan 30 kun).
  5. Repository access → Only select repositories → kerakli repolar.
  6. Permissions — eng kam kerakli ruxsat. Push uchun repo mazmuniga yozish ruxsati (Contents — read and write) kerak.
  7. Generate token — token bir marta ko'rsatiladi, darhol nusxalang.

Token bilan HTTPS orqali ishlaganda Git login va parol so'raydi. GitHub hujjatidagi namuna:

text
$ git clone https://github.com/USERNAME/REPO.git
Username: YOUR-USERNAME
Password: YOUR-PERSONAL-ACCESS-TOKEN

Password: qatoriga parolingizni emas, tokenni qo'yasiz. Ekranda hech narsa ko'rinmaydi — bu normal, terminal maxfiy satrni yashiradi.

Diqqat: Tokenni hech qachon manzil ichiga yozmang: https://TOKEN@github.com/login/bahor.git. Bu manzil .git/config ga ochiq matn bo'lib yoziladi, terminal tarixida qoladi va skrinshotda ko'rinib qoladi. To'g'ri yo'l — GCM yoki boshqa xavfsiz saqlovchi.

Tekshirib ko'ring: Nega GitHub fine-grained tokenni tavsiya qiladi?

Javob

U faqat tanlangan repolarga va faqat tanlangan ruxsatlarga ega. Token o'g'irlansa ham, zarar shu cheklov ichida qoladi. Klassik token esa akkauntingizdagi barcha repolarga kira oladi.

4. SSH kalit jufti

4.1 Qulf va kalit

SSH'ning g'oyasi bitta o'xshatishda. Siz bir xil qulfdan istalgancha nusxa yasay olasiz, kaliti esa bitta va faqat sizning cho'ntagingizda. Qulfni GitHub eshigiga osasiz. Kim shu qulfni ocha olsa — demak, u sizsiz.

  • Ochiq kalit (public key) — qulf. Uni bemalol berasiz: GitHub'ga, serverga, hamkasbga. U bilan hech kim sizning nomingizdan kira olmaydi.
  • Maxfiy kalit (private key) — kalitning o'zi. U faqat sizning kompyuteringizda turadi va hech qayerga yuborilmaydi.

Ulanish paytida GitHub "shu qulfni och-chi" deb kichik topshiriq beradi. Kompyuteringiz uni maxfiy kalit bilan bajaradi. Maxfiy kalitning o'zi tarmoq orqali ketmaydi — shuning uchun SSH paroldan xavfsizroq.

sequenceDiagram
  participant K as Kompyuter
  participant G as GitHub
  K->>G: Men aziz, ulanmoqchiman
  G->>K: Topshiriq (tasodifiy son)
  K->>K: Maxfiy kalit bilan imzolaydi
  K->>G: Imzo
  G->>G: Ochiq kalit bilan tekshiradi
  G-->>K: Ruxsat

Nimaga qarang: o'rtadagi strelkalarda maxfiy kalit yo'q. Tarmoqdan faqat topshiriq va imzo o'tadi.

4.2 Avval tekshiring: kalit bormi?

Kalitlar uy papkangizdagi yashirin .ssh papkasida saqlanadi. Git Bash'da:

bash
ls -al ~/.ssh
text
ls: cannot access '/c/Users/.../.ssh': No such file or directory

Yo'lni ... bilan qisqartirdik: sinovni vaqtinchalik papkada o'tkazdik, haqiqiy ~/.ssh ga tegmadik. Bu xabar — "papka yo'q", ya'ni hali kalit yaratilmagan. Agar papka bor va ichida id_ed25519.pub yoki id_rsa.pub bo'lsa — sizda kalit allaqachon bor. Uni ustidan yozmang, yangi kalitga boshqa nom bering.

4.3 ssh-keygen bilan kalit yaratish

GitHub hujjati tavsiya qiladigan buyruq. Email o'rniga GitHub'dagi emailingizni yozing:

bash
ssh-keygen -t ed25519 -C "aziz@example.com"
  • -t ed25519 — kalit turi. Ed25519 — zamonaviy, qisqa va tez algoritm. GitHub uni birinchi tavsiya qiladi. Juda eski tizim uni bilmasa, hujjat -t rsa -b 4096 ni beradi.
  • -C "..." — izoh (comment). Kalitni tanib olish uchun yorliq, xolos.

Buyruq ikkita savol beradi. GitHub hujjatida ular shunday ko'rinadi (Windows'dagi Git Bash):

text
> Enter file in which to save the key (/c/Users/YOU/.ssh/id_ALGORITHM):[Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

Birinchisida Enter bosasiz — standart joy yaxshi. Keyin kalit uchun parol iborasi (passphrase) ikki marta so'raladi. Yozganingiz ekranda ko'rinmaydi.

Biz sinovda savollarga javobni buyruqning o'ziga berdik (-f — fayl, -N — parol iborasi). Natija:

text
Generating public/private ed25519 key pair.
Your identification has been saved in /c/Users/.../.ssh/id_ed25519
Your public key has been saved in /c/Users/.../.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:XC5PvPjbnS2nXVkgHVEhObraY+wj5LPjAtkjcAjMh84 aziz@example.com
The key's randomart image is:
+--[ED25519 256]--+
|o .          .++o|
| = .         +.. |
|o o .     . o +  |
| E o . . + . . . |
|    o o S + .   .|
|     + o * o    o|
|      o = *    ..|
|       . B B ..+o|
|        ooXo+ ++o|
+----[SHA256]-----+

Qatorma-qator:

  • Your identification has been saved in ...id_ed25519 — maxfiy kalit saqlandi.
  • Your public key has been saved in ...id_ed25519.pub — ochiq kalit. .pub — "public".
  • The key fingerprint is: SHA256:... — kalitning barmoq izi (fingerprint): uzun kalitdan hisoblangan qisqa "pasport raqami". Ikki kalitni solishtirish uchun butun kalit emas, shu iz yetadi.
  • Pastdagi rasm (randomart) — o'sha izning ko'zga tashlanadigan ko'rinishi. Uni yodlash shart emas.

Sizda barmoq izi ham, rasm ham boshqacha bo'ladi: har kalit tasodifiy yaratiladi. Shuning uchun bu misolni hech kim takrorlay olmaydi — va aynan shu xavfsizlikning asosi.

4.4 Ikki fayl — ikki xil munosabat

bash
ls -al ~/.ssh
cat ~/.ssh/id_ed25519.pub
text
total 2
drwxr-xr-x 1 aziz 197121   0 Oct  1 09:35 .
drwxr-xr-x 1 aziz 197121   0 Oct  1 09:35 ..
-rw-r--r-- 1 aziz 197121 464 Oct  1 09:35 id_ed25519
-rw-r--r-- 1 aziz 197121  98 Oct  1 09:35 id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII7CVHxn4FaG29Ks28CEwhdIRTmLN6GA46ieY827XmeN aziz@example.com

Foydalanuvchi nomini aziz ga almashtirdik — sizda kompyuteringizdagi nom chiqadi. Ochiq kalit — bitta qator: turi (ssh-ed25519), kalitning o'zi va izoh. Aynan shu qatorni GitHub'ga qo'yasiz.

Maxfiy kalit faylining boshi esa shunday:

text
-----BEGIN OPENSSH PRIVATE KEY-----

Uni hech qachon ochib, nusxalab, chatga yoki repoga qo'ymang. Kimdir uni olsa, sizning nomingizdan GitHub'ga kira oladi.

Fayl Nima Kimga beriladi
id_ed25519 Maxfiy kalit Hech kimga
id_ed25519.pub Ochiq kalit GitHub, server

Linux va macOS'da maxfiy kalit faylining ruxsatlari faqat egasiga ochiq bo'lishi kerak — aks holda SSH uni ishlatishdan bosh tortadi (Fayl ruxsatlari). Bu mavzu serverlar bilan ishlaganda SSH chuqur darsida qaytadi.

Tekshirib ko'ring: Malika so'radi: "Serveringizga kirishim uchun kalitingizni yuboring". Qaysi faylni yuborasiz?

Javob

Hech qaysi maxfiy faylni emas. Agar maqsad — sizga uning serveriga kirish ruxsati berish bo'lsa, unga id_ed25519.pub ni yuborasiz, u uni serverga qo'yadi. Qulf beriladi, kalit emas.

4.5 Parol iborasi: nega kerak?

GitHub hujjati shunday tushuntiradi: kimdir kompyuteringizga kirib olsa, kalit ishlaydigan hamma tizimga kira oladi. Parol iborasi — qo'shimcha qatlam: fayl o'g'irlansa ham, iborasiz u ishlamaydi.

Iborani keyin o'zgartirish yoki qo'shish mumkin — kalitni qayta yaratmasdan:

bash
ssh-keygen -p -f ~/.ssh/id_ed25519

Eski va yangi ibora so'raladi. Oxirida:

text
Key has comment 'aziz@example.com'
Your identification has been saved with the new passphrase.

5. ssh-agent — iborani har safar yozmaslik

Ibora yaxshi, lekin har git push da uni yozish charchatadi. ssh-agent — fonda ishlaydigan kichik dastur. U kalitingizni xotirada ochiq holda ushlab turadi: iborani bir marta yozasiz, keyin u o'zi ishlaydi.

Git Bash'da agentni ishga tushirish:

bash
eval "$(ssh-agent -s)"
text
Agent pid 1810

pid — jarayon raqami, sizda boshqa bo'ladi. eval "$(...)" — agent bergan sozlamalarni joriy terminalga yuklaydi (Muhit o'zgaruvchilari). Endi kalitni qo'shamiz:

bash
ssh-add ~/.ssh/id_ed25519
ssh-add -l
text
Identity added: /c/Users/.../.ssh/id_ed25519 (aziz@example.com)
256 SHA256:XC5PvPjbnS2nXVkgHVEhObraY+wj5LPjAtkjcAjMh84 aziz@example.com (ED25519)

ssh-add iborani so'raydi (biz sinovda uni avtomatik berdik). ssh-add -l — agentdagi kalitlar ro'yxati: barmoq izi ssh-keygen chiqargani bilan bir xil.

5.1 Har ochilganda avtomatik

Terminalni yopsangiz, agent ham to'xtaydi. GitHub hujjatida Git for Windows uchun tayyor parcha bor: uni ~/.bashrc fayliga qo'shasiz va Git Bash har ochilganda agent o'zi ishga tushadi. Izohlarini o'zbekchaga o'girdik, kod aynan hujjatdagi:

bash
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }
agent_load_env
# 0 = agent bor, kalit bor; 1 = kalitsiz; 2 = agent yo'q
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi
unset env

Bu kod bash dasturlash tilida yozilgan — uni hozir qatorma-qator tushunish shart emas. Mazmuni: "agent ishlamayotgan bo'lsa — ishga tushir; kalit qo'shilmagan bo'lsa — qo'sh". Git Bash'ni qayta ochganingizda ibora bir marta so'raladi.

Diqqat: Windows'da ikki xil SSH bor: Git for Windows ichidagisi va Windows'ning o'zinikisi (PowerShell'dagi ssh-agent xizmati). GitHub hujjati ogohlantiradi: iborani Windows agentiga saqlasangiz, Git Bash uni ko'rmasligi va iborani qayta so'rashi mumkin. Boshlovchiga maslahat — bitta yo'lni tanlang: Git Bash va yuqoridagi .bashrc parchasi.

6. Ochiq kalitni GitHub'ga qo'shish

Avval ochiq kalitni nusxalaymiz. Git Bash'da clip — Windows'ning "buferga ko'chir" buyrug'i:

bash
clip < ~/.ssh/id_ed25519.pub

macOS'da pbcopy, boshqa joyda — cat ~/.ssh/id_ed25519.pub bilan chiqarib, qo'lda belgilaysiz. Nusxalashda ortiqcha bo'sh joy yoki yangi qator qo'shmang.

Keyin GitHub'da (docs.github.com, 2026-yil sentyabr holati):

  1. O'ng yuqorida profil rasmingiz → Settings.
  2. Chap menyuning Access bo'limida → SSH and GPG keys.
  3. New SSH key (yoki Add SSH key).
  4. Title — kalit qaysi kompyuterniki: masalan "Uy noutbuki".
  5. Kalit turi — Authentication Key (kirish uchun).
  6. Key maydoniga nusxalangan qatorni qo'yasiz.
  7. Add SSH key. GitHub parolingizni yoki 2FA kodini so'rashi mumkin.

Kalit turi ro'yxatida Signing Key ham bor — commitlarga imzo qo'yish uchun. Uni Commit imzolash darsida o'rganasiz.

Maslahat: Har kompyuterga alohida kalit yarating va Title'da qaysi kompyuter ekanini yozing. Noutbuk yo'qolsa, GitHub'da faqat o'sha kalitni o'chirasiz — qolgan kompyuterlar ishlayveradi.

7. Tekshirish: ssh -T git@github.com

bash
ssh -T git@github.com

-T — "terminal so'rama": GitHub'da buyruq bajarish imkoni yo'q, biz faqat kirish mumkinligini tekshiryapmiz.

7.1 Birinchi ulanish: "bu haqiqiy GitHub'mi?"

Birinchi marta SSH sizdan serverni tasdiqlashni so'raydi. GitHub hujjatidagi ko'rinish:

text
> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
> ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
> Are you sure you want to continue connecting (yes/no)?

Tarjimasi: "github.com xostining haqiqiyligini aniqlab bo'lmadi. Uning ED25519 kalit izi: ... Ulanishni davom ettirasizmi?" Bu — serverning o'z barmoq izi. U docs.github.com dagi "GitHub's SSH key fingerprints" sahifasidagi ro'yxat bilan bir xil bo'lishi kerak. Ed25519 uchun u yerda SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU yozilgan.

Bir xil bo'lsa — yes yozasiz. SSH izni ~/.ssh/known_hosts fayliga saqlaydi va boshqa so'ramaydi. Biz sinovda saqlangan izni tekshirdik:

bash
ssh-keygen -lf ~/.ssh/known_hosts
text
256 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU github.com (ED25519)

Hujjatdagi bilan harfma-harf bir xil. Agar farq qilsa — no deng va tarmoqni tekshiring: kimdir o'zini GitHub qilib ko'rsatayotgan bo'lishi mumkin («Hujumchi nigohi» bo'limi).

7.2 Muvaffaqiyat

Kalit GitHub'ga qo'shilgan bo'lsa, GitHub hujjati bo'yicha javob:

text
> Hi USERNAME! You've successfully authenticated, but GitHub does not
> provide shell access.

Tarjimasi: "Salom, USERNAME! Siz muvaffaqiyatli tanildingiz, lekin GitHub buyruq qatori (shell) bermaydi". USERNAME o'rnida sizning loginingiz chiqadi — unga qarang: to'g'ri akkauntmi? Ikkinchi yarmi xato emas: GitHub'da shell yo'q, u faqat Git uchun ulanish beradi. Hujjatga ko'ra buyruqning chiqish kodi ham 1 bo'ladi — bu ham normal.

Biz bu javobni o'zimiz ko'rsata olmaymiz: sinov kalitimizni ataylab GitHub'ga qo'shmadik. Yuqoridagi matn — docs.github.com dan.

7.3 Kalit qo'shilmagan bo'lsa

Bizning sinovdagi haqiqiy natija — kalit kompyuterda bor, lekin GitHub'da yo'q:

text
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).

Birinchi qator — GitHub izi known_hosts ga yozildi. Ikkinchisi: "ruxsat berilmadi (ochiq kalit)". GitHub sizni tanimadi: unga ko'rsatilgan kalit akkauntlarning birortasida yo'q. Bu xatoni «Ko'p uchraydigan xatolar» bo'limida batafsil ochamiz.

Tekshirib ko'ring: ssh -T git@github.com dan keyin Hi sardor-dev! chiqdi, sizning loginingiz esa aziz-k. Nima bo'lgan?

Javob

Kompyuterdagi kalit boshqa akkauntga — Sardornikiga — qo'shilgan. Ehtimol kompyuter avval unda bo'lgan yoki kalit adashib qo'shilgan. Push'lar sizning nomingizdan emas, Sardornikidan ketadi. Kalitni Sardorning akkauntidan o'chirib, o'zingiznikiga qo'shing yoki o'zingizga yangi kalit yarating.

8. ~/.ssh/config: bitta kompyuterda ikki akkaunt

Ba'zan bir kompyuterda ikki GitHub akkaunti bo'ladi: shaxsiy va ish akkaunti. GitHub bitta ochiq kalitni faqat bitta akkauntga qo'shishga ruxsat beradi. Demak, ikkita kalit kerak. SSH qaysi kalitni qachon ishlatishini qanday biladi?

Javob — ~/.ssh/config fayli. U SSH uchun "manzillar daftari": har taxallus (alias) uchun qaysi server, qaysi foydalanuvchi va qaysi kalit.

text
# Shaxsiy akkaunt
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

# Ish akkaunti
Host github-ish
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_ish
  IdentitiesOnly yes
  • Host — taxallus: buyruqda yoziladigan nom.
  • HostName — haqiqiy server manzili. Ikkalasi ham github.com.
  • User git — GitHub'ga har doim git foydalanuvchisi bilan ulaniladi. O'z loginingizni yozsangiz, ulanish rad etiladi.
  • IdentityFile — qaysi maxfiy kalit.
  • IdentitiesOnly yes — "faqat shu kalitni ko'rsat", boshqalarini sinab o'tirma.

Ikkinchi kalitni boshqa nom bilan yaratasiz: ssh-keygen -t ed25519 -C "ish@example.com" -f ~/.ssh/id_ed25519_ish. Ish repolarining manzilida esa github.com o'rniga taxallus yoziladi:

text
git@github-ish:kompaniya/sayt.git

SSH github-ish ni ko'radi, config'dan haqiqiy server va kalitni oladi. Biz sinovda SSH'ning o'zidan so'radik — u shu taxallusni qanday tushunadi (ssh -G faqat sozlamani hisoblaydi, ulanmaydi):

text
user git
hostname github.com
port 22
identityfile ~/.ssh/id_ed25519_ish

Commitdagi muallif emailini ham har repoda alohida qilish kerak bo'ladi — buni avtomatlashtirishni Git konfiguratsiyasi darsida ko'rasiz.

9. Qaysi birini tanlash?

Vaziyat Tavsiya
Windows, boshlovchi HTTPS + GCM
Linux server, VPS SSH kalit
Skript yoki avtomatlashtirish Fine-grained token
22-port yopiq tarmoq HTTPS yoki SSH 443-port orqali

So'nggi qator haqida: ba'zi ofis yoki mehmonxona tarmoqlari 22-portni yopadi. GitHub hujjatida buning yechimi bor — SSH'ni 443-port orqali ishlatish (ssh.github.com manzili). Kerak bo'lsa, "Using SSH over the HTTPS port" sahifasini oching.

Kursda biz HTTPS va GCM bilan davom etamiz. SSH kalitingiz esa bekorga ketmaydi: keyinroq serverga ulanishda aynan shu bilim kerak bo'ladi (SSH chuqur).

10. Hujumchi nigohi

Kirish ma'lumotlari — hujumchining eng sevimli o'ljasi. Uchta real ssenariy:

1. Maxfiy kalit yoki token repoga tushib qoladi. Dasturchi git add . qiladi va papkada id_ed25519 yoki token yozilgan fayl bor. Ochiq repodagi sirlarni maxsus botlar daqiqalar ichida topadi. Himoya: maxfiy fayllar repo papkasida umuman turmasin, .gitignore (.gitignore) va git add . dan keyin git status -s. GitHub ham yordam beradi: hujjatga ko'ra, push protection taniladigan sirni ochiq repoga yuborishni bloklaydi. Lekin bunga tayanmang — u hamma sirni tanimaydi.

2. Sir baribir chiqib ketdi. Faylni o'chirish yetmaydi: u Git tarixida qoladi va kimdir allaqachon nusxalagan bo'lishi mumkin. Birinchi qadam — bekor qilish: tokenni GitHub'da o'chirasiz, SSH kalitni SSH and GPG keys dan olib tashlaysiz va yangisini yaratasiz.

3. "O'rtadagi odam". Hujumchi tarmoqda o'zini GitHub qilib ko'rsatadi. Birinchi ulanishdagi barmoq izi tekshiruvi aynan shundan himoya qiladi. Shuning uchun yes ni ko'r-ko'rona bosmang — izni docs.github.com dagi ro'yxat bilan solishtiring. Keyinchalik SSH izning o'zgarganini sezsa, ulanishni to'xtatadi va katta ogohlantirish chiqaradi.

Qo'shimcha odatlar: maxfiy kalitga parol iborasi; tokenga muddat; har kompyuterga alohida kalit; 2FA yoqilgan GitHub akkaunti (Raqamli gigiyena).

11. Ko'p uchraydigan xatolar

11.1 Permission denied (publickey)

text
git@github.com: Permission denied (publickey).

GitHub sizni tanimadi. Tez-tez uchraydigan sabablar:

  • Ochiq kalit GitHub'ga qo'shilmagan yoki boshqa akkauntga qo'shilgan.
  • Kalit agentda yo'q — ssh-add -l bilan tekshiring.
  • Foydalanuvchi noto'g'ri: GitHub hujjatiga ko'ra, ssh -T aziz@github.com kabi o'z login bilan ulanish ham shu xatoni beradi. Har doim git@.

Batafsil tashxis uchun ssh -vT git@github.com — -v har qadamni yozib boradi: qaysi config o'qildi, qaysi kalit sinaldi.

11.2 Could not open a connection to your authentication agent.

text
Could not open a connection to your authentication agent.

Tarjimasi: "Autentifikatsiya agenti bilan bog'lanib bo'lmadi". ssh-add agentni topmadi — u ishga tushirilmagan yoki boshqa terminal oynasida qolgan. Tuzatish: eval "$(ssh-agent -s)", keyin yana ssh-add. Doimiy yechim — .bashrc parchasi.

11.3 Host key verification failed.

Biz known_hosts bo'sh va qat'iy tekshiruv yoqilgan holatda sinadik:

text
No ED25519 host key is known for github.com and you have requested strict checking.
Host key verification failed.

Tarjimasi: "github.com uchun ED25519 kaliti ma'lum emas, siz esa qat'iy tekshiruvni so'ragansiz. Xost kalitini tekshirish muvaffaqiyatsiz." Odatda birinchi ulanishdagi savolga no deb javob berganda yoki savolni ko'rmasdan Enter bosganda chiqadi. Tuzatish: ssh -T git@github.com ni qayta yozing, izni solishtiring va yes deng.

11.4 HTTPS'da parol qabul qilinmadi

Token o'rniga GitHub parolingizni yozdingiz — Git kirishni rad etadi. HTTPS'da Password: ga faqat token yoziladi. GCM ishlatsangiz, parol umuman so'ralmaydi: brauzer oynasi ochiladi.

11.5 Kalitni repoga yoki chatga yuborish

Eng og'ir xato — id_ed25519 faylini (.pub siz!) kimgadir yuborish. Yuborgan bo'lsangiz — kalitni GitHub'dan darhol o'chiring va yangisini yarating.

12. Mashqlar

1-mashq (oson): Qulfmi, kalitmi?

Har bir narsani "berish mumkin" yoki "hech kimga" deb belgilang:

  1. ~/.ssh/id_ed25519.pub
  2. ~/.ssh/id_ed25519
  3. Fine-grained token
  4. Kalitning barmoq izi SHA256:...
  5. ~/.ssh/known_hosts dagi GitHub qatori
Yechim
  1. Berish mumkin — ochiq kalit, "qulf".
  2. Hech kimga — maxfiy kalit.
  3. Hech kimga — token parol bilan teng.
  4. Berish mumkin — iz kalitni tanib olish uchun, u bilan kirib bo'lmaydi.
  5. Berish mumkin — bu GitHub serverining ochiq kaliti, docs.github.com da ham ochiq turibdi.

2-mashq (o'rta): Bo'sh joylarni to'ldiring

Ish noutbuki uchun ed25519 kalit yarating va uni agentga qo'shing:

bash
ssh-keygen -t  -C "aziz@example.com"
eval "$(ssh- -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add 
clip < ~/.ssh/

Ishora: ro'yxatni ko'rsatadigan flag — "list"ning birinchi harfi. GitHub'ga qaysi fayl ketishi — «Ikki fayl — ikki xil munosabat» bo'limida.

Yechim
bash
ssh-keygen -t ed25519 -C "aziz@example.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
clip < ~/.ssh/id_ed25519.pub

clip ga faqat .pub fayl beriladi — uni GitHub'ga qo'yasiz. ssh-add -l dagi barmoq izi ssh-keygen chiqargani bilan bir xil bo'lishi kerak.

3-mashq (qiyin): Ikki akkaunt

Aziz kunduzi "Raqam" kompaniyasida ishlaydi (raqam-dev akkaunti), kechqurun o'z portfoliosini yozadi (aziz-k akkaunti). Kompaniya reposi: git@github.com:raqam/kassa.git.

  1. Ikkinchi kalitni qanday nom bilan yaratadi?
  2. ~/.ssh/config ga qanday blok qo'shadi (taxallus — github-raqam)?
  3. Kompaniya reposi manzili qanday o'zgaradi?
  4. Ikkala akkaunt to'g'ri ishlayotganini qanday tekshiradi?

Ishora: «Bitta kompyuterda ikki akkaunt» bo'limidagi config va ssh -T ga taxallus ham berish mumkin.

Yechim
  1. ssh-keygen -t ed25519 -C "aziz@raqam.example.com" -f ~/.ssh/id_ed25519_raqam — standart nomni bosib yubormaslik uchun -f bilan boshqa nom. Ochiq kalitni raqam-dev akkauntiga qo'shadi.
  2. Blok:
text
Host github-raqam
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_raqam
  IdentitiesOnly yes
  1. git@github-raqam:raqam/kassa.git — github.com o'rniga taxallus.
  2. ssh -T git@github.com — Hi aziz-k! chiqishi kerak. ssh -T git@github-raqam — Hi raqam-dev!. Ikkalasida ham login to'g'ri bo'lsa, sozlama ishlaydi.

4-mashq: Portfolio qadami — GitHub'ga ulanishga tayyorlaning

Keyingi darsda kurs/portfolio ni GitHub'dagi login.github.io repongizga ulaysiz. Bugun yo'lni tayyorlaymiz.

  1. git config --show-scope --get-all credential.helper — GCM yoqilganmi?
  2. GitHub akkauntingizda 2FA yoqilganmi? Yoqilmagan bo'lsa — Raqamli gigiyena darsidagi qadamlar bilan yoqing.
  3. Ixtiyoriy, lekin tavsiya etiladi: SSH kalit yarating (parol iborasi bilan), uni agentga va GitHub'ga qo'shing, ssh -T git@github.com bilan tekshiring.
  4. mashqlar/07/25-ssh-kalit/javoblar.md faylini yarating. Unga yozing: qaysi yo'lni tanladingiz, kalit barmoq izi (agar yaratgan bo'lsangiz) va ssh -T natijasining birinchi so'zlari. Commit: 07/25: SSH va autentifikatsiya javoblarini qo'sh.
Yechim
bash
git config --show-scope --get-all credential.helper
ls -al ~/.ssh
ssh-keygen -t ed25519 -C "sizning@emailingiz"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
clip < ~/.ssh/id_ed25519.pub
ssh -T git@github.com
cd ~/kurs/mashqlar
mkdir -p 07/25-ssh-kalit
code 07/25-ssh-kalit/javoblar.md
git add 07/25-ssh-kalit
git commit -m "07/25: SSH va autentifikatsiya javoblarini qo'sh"

credential.helper uchun system manager chiqishi kerak. clip dan keyin GitHub'da Settings → SSH and GPG keys → New SSH key ga qo'yasiz. ssh -T javobida Hi dan keyin o'z loginingiz bo'lsin.

Javoblar fayliga namuna:

text
Yo'l: HTTPS + GCM (asosiy), SSH kalit ham tayyor.
Kalit izi: SHA256:...  (ssh-keygen -lf ~/.ssh/id_ed25519.pub)
ssh -T: Hi login! You've successfully authenticated...

Maxfiy kalit, token yoki parolni bu faylga yozmang — mashqlar repo GitHub'da ochiq bo'ladi.

13. Real ishda

  • Birinchi ish kuni. Odatda birinchi topshiriq — kompaniya GitHub'iga kirish: SSH kalit yaratib, ochiq kalitni yuborasiz yoki akkauntga qo'shasiz. Bu darsdan keyin buni 5 daqiqada qilasiz.
  • Serverlar. VPS'ga kirish ham SSH kalit bilan: ochiq kalit serverdagi authorized_keys fayliga qo'yiladi. Kurs davomida sayt aynan shunday serverga joylanadi (SSH chuqur).
  • CI va avtomatlashtirish. Skriptlar va GitHub Actions'da shaxsiy parol emas, cheklangan token yoki maxsus kalit ishlatiladi. GitHub CLI ham (gh) kirish ma'lumotini o'zi saqlaydi.
  • Intervyuda: "SSH va HTTPS farqi?", "Ochiq va maxfiy kalit farqi?", "Token o'g'irlansa nima qilasiz?" — uchala savolga bu dars javob beradi.

Xulosa

  • GitHub Git uchun parolni qabul qilmaydi: HTTPS'da GCM yoki token, SSH'da kalit jufti.
  • Windows'da HTTPS + Git Credential Manager tayyor: birinchi push'da brauzer orqali bir marta kirasiz.
  • ssh-keygen -t ed25519 -C "email" — ikki fayl: .pub (qulf) beriladi, maxfiy kalit hech kimga.
  • ssh-agent + ssh-add iborani eslab qoladi; ssh -T git@github.com ulanishni tekshiradi.
  • Birinchi ulanishda GitHub barmoq izini docs.github.com bilan solishtiring.
  • Ikki akkaunt — ikki kalit va ~/.ssh/config dagi taxallus.

Keyingi dars: Remote: clone, fetch, pull, push — «Bahor» va portfolio'ni GitHub'ga ulaymiz: birinchi push, clone, fetch va pull.

Manbalar

  • GitHub Docs: "Generating a new SSH key and adding it to the ssh-agent", "Adding a new SSH key to your GitHub account" — docs.github.com/authentication
  • GitHub Docs: "Testing your SSH connection", "GitHub's SSH key fingerprints", "Working with SSH key passphrases", "Error: Permission denied (publickey)" — docs.github.com/authentication
  • GitHub Docs: "About remote repositories", "Caching your GitHub credentials in Git", "Managing your personal access tokens", "Using SSH over the HTTPS port" — docs.github.com
  • OpenSSH qo'llanmasi: ssh-keygen, ssh-agent, ssh_config — man.openbsd.org
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
SSH kalit va GitHub autentifikatsiyasi: ssh-keygen, ssh-agent va HTTPS token — IlmHamroh