Mundarija (36)
- Bu darsda
- 1. Nega bu kerak?
- 2. Ikki yo'l: HTTPS va SSH
- 3. HTTPS: Git Credential Manager va token
- 3.1 GCM — Windows'da tayyor yo'l
- 3.2 Token — parol o'rnidagi maxsus kalit
- 4. SSH kalit jufti
- 4.1 Qulf va kalit
- 4.2 Avval tekshiring: kalit bormi?
- 4.3 ssh-keygen bilan kalit yaratish
- 4.4 Ikki fayl — ikki xil munosabat
- 4.5 Parol iborasi: nega kerak?
- 5. ssh-agent — iborani har safar yozmaslik
- 5.1 Har ochilganda avtomatik
- 6. Ochiq kalitni GitHub'ga qo'shish
- 7. Tekshirish: ssh -T git@github.com
- 7.1 Birinchi ulanish: "bu haqiqiy GitHub'mi?"
- 7.2 Muvaffaqiyat
- 7.3 Kalit qo'shilmagan bo'lsa
- 8. ~/.ssh/config: bitta kompyuterda ikki akkaunt
- 9. Qaysi birini tanlash?
- 10. Hujumchi nigohi
- 11. Ko'p uchraydigan xatolar
- 11.1 Permission denied (publickey)
- 11.2 Could not open a connection to your authentication agent.
- 11.3 Host key verification failed.
- 11.4 HTTPS'da parol qabul qilinmadi
- 11.5 Kalitni repoga yoki chatga yuborish
- 12. Mashqlar
- 1-mashq (oson): Qulfmi, kalitmi?
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Ikki akkaunt
- 4-mashq: Portfolio qadami — GitHub'ga ulanishga tayyorlaning
- 13. Real ishda
- Xulosa
- Manbalar
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 ed25519bilan kalit juftini yaratasiz, ochiq kalitni GitHub'ga qo'shasiz vassh -T git@github.combilan 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-keygenbilan ed25519 kalit yaratib, ochiq va maxfiy kalitni farqlay olasiz.ssh-agentvassh-addbilan kalit parolini har safar yozmaslikni sozlaysiz.- Ochiq kalitni GitHub'ga qo'shib,
ssh -T git@github.comnatijasini o'qiysiz. - Bitta kompyuterda ikki GitHub akkaunti uchun
~/.ssh/configyozasiz.
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 --> GNimaga 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.gitmanzilini 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:
git config --show-scope --get-all credential.helper
git credential-manager --versionsystem manager
2.7.3+5fa7116896c82164996a609accd1c5ad90fe730asystem 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):
- O'ng yuqoridagi profil rasmingiz → Settings.
- Chap menyuda Developer settings.
- Personal access tokens → Fine-grained tokens → Generate new token.
- Token name — nom, Expiration — muddat (masalan 30 kun).
- Repository access → Only select repositories → kerakli repolar.
- Permissions — eng kam kerakli ruxsat. Push uchun repo mazmuniga yozish ruxsati (Contents — read and write) kerak.
- Generate token — token bir marta ko'rsatiladi, darhol nusxalang.
Token bilan HTTPS orqali ishlaganda Git login va parol so'raydi. GitHub hujjatidagi namuna:
$ git clone https://github.com/USERNAME/REPO.git
Username: YOUR-USERNAME
Password: YOUR-PERSONAL-ACCESS-TOKENPassword: 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/configga 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: RuxsatNimaga 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:
ls -al ~/.sshls: cannot access '/c/Users/.../.ssh': No such file or directoryYo'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:
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 4096ni beradi.-C "..."— izoh (comment). Kalitni tanib olish uchun yorliq, xolos.
Buyruq ikkita savol beradi. GitHub hujjatida ular shunday ko'rinadi (Windows'dagi Git Bash):
> 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:
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
ls -al ~/.ssh
cat ~/.ssh/id_ed25519.pubtotal 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.comFoydalanuvchi 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:
-----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:
ssh-keygen -p -f ~/.ssh/id_ed25519Eski va yangi ibora so'raladi. Oxirida:
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:
eval "$(ssh-agent -s)"Agent pid 1810pid — jarayon raqami, sizda boshqa bo'ladi. eval "$(...)" — agent bergan sozlamalarni joriy terminalga yuklaydi (Muhit o'zgaruvchilari). Endi kalitni qo'shamiz:
ssh-add ~/.ssh/id_ed25519
ssh-add -lIdentity 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:
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 envBu 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-agentxizmati). 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.bashrcparchasi.
6. Ochiq kalitni GitHub'ga qo'shish
Avval ochiq kalitni nusxalaymiz. Git Bash'da clip — Windows'ning "buferga ko'chir" buyrug'i:
clip < ~/.ssh/id_ed25519.pubmacOS'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):
- O'ng yuqorida profil rasmingiz → Settings.
- Chap menyuning Access bo'limida → SSH and GPG keys.
- New SSH key (yoki Add SSH key).
- Title — kalit qaysi kompyuterniki: masalan "Uy noutbuki".
- Kalit turi — Authentication Key (kirish uchun).
- Key maydoniga nusxalangan qatorni qo'yasiz.
- 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
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:
> 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:
ssh-keygen -lf ~/.ssh/known_hosts256 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:
> 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:
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.comdan keyinHi sardor-dev!chiqdi, sizning loginingiz esaaziz-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.
# 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 yesHost— taxallus: buyruqda yoziladigan nom.HostName— haqiqiy server manzili. Ikkalasi hamgithub.com.User git— GitHub'ga har doimgitfoydalanuvchisi 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:
git@github-ish:kompaniya/sayt.gitSSH 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):
user git
hostname github.com
port 22
identityfile ~/.ssh/id_ed25519_ishCommitdagi 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)
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 -lbilan tekshiring. - Foydalanuvchi noto'g'ri: GitHub hujjatiga ko'ra,
ssh -T aziz@github.comkabi o'z login bilan ulanish ham shu xatoni beradi. Har doimgit@.
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.
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:
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:
~/.ssh/id_ed25519.pub~/.ssh/id_ed25519- Fine-grained token
- Kalitning barmoq izi
SHA256:... ~/.ssh/known_hostsdagi GitHub qatori
Yechim
- Berish mumkin — ochiq kalit, "qulf".
- Hech kimga — maxfiy kalit.
- Hech kimga — token parol bilan teng.
- Berish mumkin — iz kalitni tanib olish uchun, u bilan kirib bo'lmaydi.
- 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:
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
ssh-keygen -t ed25519 -C "aziz@example.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
clip < ~/.ssh/id_ed25519.pubclip 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.
- Ikkinchi kalitni qanday nom bilan yaratadi?
~/.ssh/configga qanday blok qo'shadi (taxallus —github-raqam)?- Kompaniya reposi manzili qanday o'zgaradi?
- 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
ssh-keygen -t ed25519 -C "aziz@raqam.example.com" -f ~/.ssh/id_ed25519_raqam— standart nomni bosib yubormaslik uchun-fbilan boshqa nom. Ochiq kalitniraqam-devakkauntiga qo'shadi.- Blok:
Host github-raqam
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_raqam
IdentitiesOnly yesgit@github-raqam:raqam/kassa.git—github.como'rniga taxallus.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.
git config --show-scope --get-all credential.helper— GCM yoqilganmi?- GitHub akkauntingizda 2FA yoqilganmi? Yoqilmagan bo'lsa — Raqamli gigiyena darsidagi qadamlar bilan yoqing.
- Ixtiyoriy, lekin tavsiya etiladi: SSH kalit yarating (parol iborasi bilan), uni agentga va GitHub'ga qo'shing,
ssh -T git@github.combilan tekshiring. mashqlar/07/25-ssh-kalit/javoblar.mdfaylini yarating. Unga yozing: qaysi yo'lni tanladingiz, kalit barmoq izi (agar yaratgan bo'lsangiz) vassh -Tnatijasining birinchi so'zlari. Commit:07/25: SSH va autentifikatsiya javoblarini qo'sh.
Yechim
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:
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_keysfayliga 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-addiborani eslab qoladi;ssh -T git@github.comulanishni tekshiradi.- Birinchi ulanishda GitHub barmoq izini docs.github.com bilan solishtiring.
- Ikki akkaunt — ikki kalit va
~/.ssh/configdagi 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
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!