تخطَّ إلى المحتوى
القائمة
→ كل المقالات
ملاحظة3 دقائق قراءة

افرض SSH بدل HTTPS في عمليات Git

أوقفت GitHub هذا الشهر قبول كلمات المرور في عمليات Git، والمفاتيح كانت الجواب الأفضل أصلًا. إليك إعدادًا يصمد أيضًا أمام الأدوات التي تكتب روابط HTTPS في صلبها.

  • برمجيات
  • هندسة

قبل عشرة أيام أوقفت GitHub قبول كلمات مرور الحسابات في عمليات Git عبر HTTPS. فإن كنت تدفع تعديلاتك عبر HTTPS فأنت الآن تلصق رمز وصول شخصيًا بدل كلمة المرور: سرٌّ أطول، محفوظٌ في المكان نفسه الذي كانت فيه كلمة المرور، وتنتهي صلاحيته في موعدٍ عليك أن تتذكّره.

يتجاوز SSH هذه المسألة كلها. تُولّد زوج مفاتيح مرة واحدة، وتُبقي النصف الخاص على جهازك، وتُسلّم النصف العام للخادم، ثم تتوقف عن كتابة بيانات الاعتماد في Git نهائيًا. وهو يوثّق الخادم لديك أيضًا، وهو ما لا يفعله رمز الوصول.

يستغرق الإعداد خمس دقائق تقريبًا. والخطوتان الأخيرتان هما ما تغفله أغلب الشروحات، وهما سبب ثبات هذا الإعداد.

توليد المفتاح

ssh-keygen -t ed25519 -C "personal github" -f ~/.ssh/personal-github

اخترتُ ed25519 بدل RSA: مفاتيح أقصر، ومصافحة أسرع، ولا وسيط لحجم المفتاح يمكن أن تخطئ فيه. وإن اضطررت للتعامل مع نظامٍ أقدم من OpenSSH 6.5، فالبديل هو ‏-t rsa -b 4096.

سمِّ المفتاح باسم ما يفتحه — personal-github أو work-gitlab — وأنشئ مفتاحًا لكل حساب لا مفتاحًا لكل جهاز. فالحسابات تُلغى فرادى، ومفتاحٌ اسمه id_ed25519_2 لن يخبرك بشيء يوم تحتاج إلى إلغائه.

واستخدم عبارة مرور. فوجود الوكيل (agent) يعني أنك تكتبها مرة في الجلسة، لا مرة مع كل دفعة.

إضافة المفتاح العام إلى الخادم

انسخ النصف العام — الملف المنتهي بـ .pub، لا الآخر أبدًا:

pbcopy < ~/.ssh/personal-github.pub

ثم ألصقه في إعدادات حسابك: GitHub أو GitLab أو Bitbucket.

إعادة كتابة روابط HTTPS إلى SSH

لا ينفع المفتاح ما دامت مستودعاتك البعيدة تبدأ بـ https://. وبدل إصلاحها مستودعًا مستودعًا، اطلب من Git أن يستبدلها كلها، في ملف ~/.gitconfig:

[url "ssh://git@github.com/"]
  insteadOf = https://github.com/

[url "ssh://git@gitlab.com/"]
  insteadOf = https://gitlab.com/

[url "ssh://git@bitbucket.org/"]
  insteadOf = https://bitbucket.org/

الآن يُعاد كتابة كل رابط HTTPS لتلك المواقع قبل أن يغادر الطلبُ جهازك — بما في ذلك الروابط التي لم تكتبها أنت. وهذا يشمل ملفات CocoaPods، وأمر go get، وحِزَم npm التي تشير إلى مستودع Git، والوحدات الفرعية المستنسخة من ملف .gitmodules كتبه غيرك، ونصوص التكامل المستمر التي تفضّل ألّا تمسّها.

هذه هي الخطوة التي تحوّل «أعددتُ مفتاحًا» إلى «لم أعد أرى طلب بيانات اعتماد أبدًا».

إخبار SSH بأيّ مفتاح يستعمل

صار Git يتحدث SSH، لكن على SSH أن يختار مفتاحًا. وإن تُرك وشأنه جرّب الأسماء الافتراضية، فلا يُعرَض مفتاحٌ اسمه personal-github أصلًا. في ملف ~/.ssh/config:

Host github.com
  User git
  IdentityFile ~/.ssh/personal-github
  IdentitiesOnly yes
  AddKeysToAgent yes

Host gitlab.com
  User git
  IdentityFile ~/.ssh/work-gitlab
  IdentitiesOnly yes
  AddKeysToAgent yes

يستحق السطر IdentitiesOnly yes وجوده. فبدونه يعرض SSH كل مفتاحٍ لدى الوكيل، بالترتيب الذي يحلو له، وقد يرفضك خادمٌ رأى المفتاح الخطأ أولًا قبل أن يُجرَّب المفتاح الصحيح — وهو ما يبدو خللًا في الصلاحيات وليس كذلك.

وعلى macOS، أضف UseKeychain yes إلى كل كتلة Host لتبقى عبارة المرور محفوظة بعد إعادة التشغيل.

التحقق

ssh -T git@github.com

ظهور تحية باسم مستخدمك يعني أن المفتاح يعمل. وللتأكد من إعادة كتابة الروابط، جرّب طلبًا عبر HTTPS وراقب مروره دون أن يُطلب منك شيء:

git ls-remote https://github.com/omaralbeik/SwifterSwift.git

فإن أعاد لك المراجع دون أن يسأل عن شيء، فالنصفان في مكانهما: Git يعيد كتابة الرابط، و SSH يختار المفتاح الصحيح له.

أحدث المقالات

المواضيع

كل النتائج