---
title: "افرض SSH بدل HTTPS في عمليات Git"
description: "أوقفت GitHub هذا الشهر قبول كلمات المرور في عمليات Git، والمفاتيح كانت الجواب الأفضل أصلًا. إليك إعدادًا يصمد أيضًا أمام الأدوات التي تكتب روابط HTTPS في صلبها."
author: "Omar Albeik"
date: 2021-08-23
type: note
topics: [software, engineering]
language: ar
reading_time_minutes: 3
canonical_url: https://albeik.dev/ar/blog/enforce-ssh-instead-of-http-for-git-operations
translation_url: https://albeik.dev/en/blog/enforce-ssh-instead-of-http-for-git-operations
source_url: https://albeik.dev/ar/blog/enforce-ssh-instead-of-http-for-git-operations.md
---

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

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

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

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

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

```bash
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`، لا الآخر أبدًا:

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

ثم ألصقه في إعدادات حسابك:
[GitHub](https://docs.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account)
أو [GitLab](https://docs.gitlab.com/ee/ssh/)
أو [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/set-up-an-ssh-key/).

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

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

```ini
[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`:

```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` لتبقى عبارة المرور محفوظة
بعد إعادة التشغيل.

## التحقق

```bash
ssh -T git@github.com
```

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

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

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