--- title: Managing multiple SSH keys localeTitle: إدارة عدة مفاتيح SSH --- # إدارة عدة مفاتيح SSH من الأسلم أن نقول أن معظم المطورين في مجال الويب لديهم في وقت ما مشكلة SSH. يعد SSH أحد البروتوكولات الأكثر استخدامًا لتبادل البيانات بأمان. تستخدم SSH للتوصيل بالخوادم البعيدة ، والتي تتضمن أيضًا إدارة شفرتك باستخدام git والمزامنة مع المستودعات عن بُعد. على الرغم من أنه من الممارسات الجيدة أن يكون لديك زوج مفاتيح خاص عام لكل جهاز ، فأحيانًا ما تحتاج إلى استخدام مفاتيح متعددة و / أو لديك أسماء مفاتيح غير تقليدية. قد تستخدم زوجًا رئيسيًا من مفاتيح SSH للعمل في المشروعات الداخلية لشركتك ولكنك قد تستخدم مفتاحًا مختلفًا للوصول إلى بعض خوادم عملاء الشركة. قد تكون حتى تستخدم مفتاحًا مختلفًا للوصول إلى خادمك الخاص. يمكن أن تصبح إدارة مفاتيح SSH مرهقة بمجرد أن تحتاج إلى استخدام مفتاح ثانٍ. آمل أن تكون هذه المقالة مفيدة لأي شخص لديه مشاكل مع إدارة مفتاح SSH. وأفترض أن القارئ لديه معرفة أساسية من بوابة و SSH. معظم الأمثلة في جميع أنحاء المقال سوف تستخدم بوابة. بالطبع ، كل هذا سوف ينطبق على أي اتصال SSH آخر. يقال ، هناك بعض الخدع git- محددة المدرجة. حزام في ، هنا نذهب! ## الوضع الراهن أولاً ، لنرى كيف سيبدو سير عملك قبل وجود عدة مفاتيح للقلق. لديك مفتاح خاص واحد مخزن في `~/.ssh/id_rsa` مع مفتاح عام مناظرة `~/.ssh/id_rsa.pub` . دعونا نتخيل أنك تريد دفع / سحب تغييرات الكود إلى / من خادم git بعيد؛ قل GitHub ، whynot. للقيام بذلك ، يجب عليك أولاً إضافة مفتاحك العام إلى GitHub. لن أتجاوز هذه الخطوة ، يجب أن يكون من السهل معرفة كيفية القيام بذلك. لقد افترضت أيضًا أن اسمك هو Steve وأنك تعمل في مشروع شديد السرية يستخدم فطائر Raspberry Pies للحصول على حركة مرور الشبكة. لبدء عملك ، عليك استنساخ مستودع git باستخدام SSH: ```bash git clone git@github.com:steve/raspberry-spy.git ``` في هذه اللحظة ، سيكون GitHub مثل: "Yo ، هذا مستودع خاص! نحن بحاجة إلى تشفير حركة المرور باستخدام هذا المفتاح العام الذي أمتلكه هنا ومفتاحك الخاص" لقد قمت بإضافة المفتاح العام إلى ملف التعريف الخاص بك على GitHub ، ولكن SSH لديه بطريقة أو بأخرى معرفة أين يوجد المفتاح الخاص المقابل الخاص بك. نظرًا لأننا لا نملك أي فكرة عن المفتاح الخاص الذي يجب استخدامه عند استخدام SSH في `git@github.com` ، يحاول عميل SSH العثور على مفتاح في الموقع الافتراضي ، وهو `~/.ssh/id_rsa` - إنه أفضل تخمين له. إذا لم يكن هناك ملف في هذا الموقع ، فستتلقى خطأً: ```bash Cloning into 'raspberry-spy'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. ``` إذا كان لديك _بعض_ المفاتيح الخاصة المخزنة في الملف `~/.ssh/id_rsa` ، `~/.ssh/id_rsa` عميل SSH هذا المفتاح الخاص لتشفير الاتصالات. إذا كان هذا المفتاح مرتبطًا بكلمة مرور (كما ينبغي أن يكون) ، فستتم مطالبتك بكلمة مرور ، مثل: ```bash Enter passphrase for key '/Users/steve/.ssh/id_rsa': ``` إذا أدخلت عبارة المرور الصحيحة وإذا كان هذا المفتاح الخاص هو بالفعل المفتاح الذي يتوافق مع المفتاح العام الذي أرفقته بملفك الشخصي ، فسيتم سداد كل شيء بشكل جيد وسيتم استنساخ المستودع بنجاح. ولكن ماذا لو قمت بتسمية المفتاح الخاص بك بشكل مختلف (على سبيل المثال. `~/.ssh/_id_rsa` )؟ لن يتمكن عميل SSH من تحديد مكان تخزين المفتاح الخاص. ستحصل على نفس `Permission denied ...` خطأ كما كان من قبل. إذا كنت تريد استخدام مفتاح خاص سميته بشكل مختلف ، فيجب عليك إضافته يدويًا: ```bash ssh-add ~/.ssh/_id_rsa ``` بعد إدخال عبارة المرور ، يمكنك التحقق مما إذا كان المفتاح قد تمت إضافته إلى `ssh-agent` (عميل SSH) عن طريق تنفيذ `ssh-add -l` . يقوم هذا الأمر بإدراج جميع المفاتيح المتوفرة حاليًا لعميل SSH. إذا حاولت استنساخ المستودع الآن ، فستكون ناجحة. ## حتى الان جيدة جدا؟ إذا كنت مهتمًا ، فقد تبدأ في ملاحظة بعض المشكلات المحتملة. أولا ، إذا قمت بإعادة تشغيل جهاز الكمبيوتر الخاص بك ، سيتم إعادة تشغيل `ssh-agent` إلى إضافة مفاتيحك التي لا تحمل الاسم الافتراضي باستخدام `ssh-add` جديد ، وكتابة كلمات المرور وكل تلك الأشياء الشاقة. يمكننا أتمتة إضافة مفاتيح أو بطريقة ما تحديد أي مفتاح لاستخدامه عند الوصول إلى خوادم معينة؟ هل يمكننا حفظ كلمات المرور بطريقة أو بأخرى حتى لا نضطر إلى كتابتها في كل مرة؟ إذا كان هناك فقط شيء مثل _سلسلة المفاتيح_ لحفظ مفاتيح SSH المحمية بكلمة مرور. كن مطمئنا ، هناك إجابات لجميع هذه الأسئلة. ## أدخل ، SSH `config` كما تبين ، فإن [ملف إعدادات SSH](https://linux.die.net/man/5/ssh_config) شيء ، الشيء الذي يمكن أن يساعدنا. إنه ملف تهيئة لكل مستخدم لاتصال SSH. إنشاء ملف جديد: `~/.ssh/config` وفتحه للتحرير. ### إدارة مفاتيح SSH المسمى عليها أول شيء سنقوم بحله باستخدام ملف `config` هذا هو تجنب الاضطرار إلى إضافة مفاتيح SSH ذات اسم مخصص باستخدام `ssh-add` . بفرض افتراض أن مفتاح SSH الخاص بك هو `~/.ssh/_id_rsa` ، أضف المتابعة إلى ملف `config` : ```bash Host github.com HostName github.com User git IdentityFile ~/.ssh/_id_rsa IdentitiesOnly yes ``` الآن تأكد من أن `~/.ssh/_id_rsa` ليس في `ssh-agent` بتنفيذ `ssh-add -D` . سيؤدي هذا الأمر إلى إزالة كافة المفاتيح من جلسة عمل `ssh-agent` النشطة حاليًا. يتم إعادة ضبط الجلسة في كل مرة تقوم فيها بتسجيل الخروج أو إعادة التشغيل (أو إذا قمت بقتل عملية `ssh-agent` يدوياً). يمكننا "محاكاة" إعادة التشغيل عن طريق تنفيذ الأمر المذكور. إذا حاولت استنساخ مستودع GitHub الخاص بك الآن ، فسيكون ذلك كما لو قمنا بإضافة المفتاح يدويًا (كما فعلنا من قبل). سيُطلب منك كلمة المرور: ```bash git clone git@github.com:steve/raspberry-spy.git Cloning into 'raspberry-spy'... Enter passphrase for key '/Users/steve/.ssh/_id_rsa': ``` ستلاحظ أن المفتاح الذي نطالب بكلمة المرور الخاصة به هو نفس المفتاح الذي حددناه في ملف `config` بنا. بعد إدخال كلمة مرور مفتاح SSH الصحيحة ، سيتم استنساخ المستودع بنجاح. ملاحظة: إذا حاولت ، بعد الاستنساخ الناجح ، `git pull` ، فستتم مطالبتك بكلمة المرور مرة أخرى. سنحل ذلك لاحقا. من المهم أن `Host github.com` من `config` و `github.com` من URI `git@github.com:steve/raspberry-spy.git` المباراة. يمكنك أيضا تغيير `config` لتكون `Host mygithub` واستنساخ باستخدام URI `git@mygithub:steve/raspberry-spy.git` . هذا يفتح البوابات. عندما تقوم بإعادة هذا ، فإن ذهنك يتسابق ويفكر في كيفية انتهاء كل مشاكلك مع مفاتيح SSH. فيما يلي بعض أمثلة التكوين المفيدة: ```bash Host bitbucket-corporate HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_corp IdentitiesOnly yes ``` الآن يمكنك استخدام `git clone git@bitbucket-corporate:company/project.git` ```bash Host bitbucket-personal HostName bitbucket.org User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes ``` الآن يمكنك استخدام `git clone git@bitbucket-personal:steve/other-pi-project.git` ``` Host myserver HostName ssh.steve.com Port 1111 IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes User steve IdentitiesOnly yes ``` الآن يمكنك SSH في الخادم الخاص بك باستخدام `ssh myserver` . كم ذلك رائع؟ لا تحتاج إلى إدخال المنفذ واسم المستخدم يدويًا في كل مرة تقوم فيها بتنفيذ الأمر `ssh` . #### مكافأة: في إعدادات المستودع يمكنك أيضًا تحديد المفتاح المحدد الذي يجب استخدامه لمخزون معين ، وتجاوز أي شيء في `config` SSH. يمكن تحديد أمر SSH محدد عن طريق تعيين `sshCommand` تحت `core` في `/.git/config` . مثال: ```bash [core] sshCommand = ssh -i ~/.ssh/id_rsa_corp ``` هذا ممكن مع git 2.10 أو في وقت لاحق. يمكنك أيضًا استخدام هذا الأمر لتجنب تعديل الملف يدويًا: ```bash git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_corp' ``` ### إدارة كلمة المرور آخر جزء من اللغز هو إدارة كلمات المرور. نريد تجنب إدخال كلمة المرور في كل مرة يبدأ فيها اتصال SSH. للقيام بذلك ، يمكننا الاستفادة من برامج إدارة المفاتيح التي تأتي مع MacOS وتوزيعات Linux المختلفة. ابدأ بإضافة مفتاحك إلى keychain عبر تمرير الخيار `-K` إلى الأمر `ssh-add` : ```bash ssh-add -K ~/.ssh/id_rsa_whatever ``` يمكنك الآن رؤية مفتاح SSH في keychain. على MacOS ، يبدو الأمر كالتالي: ![Keychain Access](https://raw.githubusercontent.com/fvoska/guides/master/static/images/pages/ssh/managing-multiple-ssh-keys/keychain-access.png "الوصول إلى سلسلة المفاتيح") إذا قمت بإزالة المفاتيح من `ssh-agent` عبر `ssh-add -D` (سيحدث ذلك عند إعادة تشغيل الكمبيوتر ، كما ذكر من قبل) ومحاولة SSH-ing ، ستتم مطالبتك بكلمة المرور مرة أخرى. لماذا ا؟ لقد أضفنا للتو مفتاح سلسلة المفاتيح. إذا قمت بفحص Keychain Access مرة أخرى ، فسوف تلاحظ أن المفتاح الذي أضفته باستخدام `ssh-add -K` لا يزال موجودًا في keychain. غريب ، هاه؟ اتضح أن هناك طارة واحدة أكثر من القفز. افتح ملف SSH `config` الخاص بك وقم بإضافة ما يلي: ```bash Host * AddKeysToAgent yes UseKeychain yes ``` الآن ، سوف تبحث SSH عن المفتاح في keychain وإذا وجدت أنه لن تتم مطالبتك بكلمة المرور. مفتاح سيضاف أيضا إلى `ssh-agent` . على MacOS ، سيعمل هذا على MacOS Sierra 10.12.2 أو ما بعده. في Linux ، يمكنك استخدام شيء ما مثل `gnome-keyring` وقد يعمل حتى بدون إجراء هذا التعديل الأخير على `config` SSH. أما بالنسبة لنظام التشغيل Windows - من يدري ، أليس كذلك؟ آمل أن يكون أحدهم قد وجد هذا مفيدًا. الآن اذهب وتكوين ملف SSH `config` الخاص بك!