افرض 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 يختار المفتاح الصحيح له.