امضای دیجیتالی Commit ها در گیت

آرش حاتمی

آرش حاتمی

DevOps - Network Eng

امضای الکترونیکی عبارت است از داده های الکترونیکی موجود در یک داده پیام، منضم شده به آن یا داده های الکترونیکی که به صورت منطقی به یک داده پیام متصل اند و از آن می توان برای شناسایی امضا کننده مرتبط با داده پیام استفاده کرد و تایید وی در خصوص اطلاعات موجود در داده پیام را نشان داد. ( همکاران سیستم ) در این پست به بررسی پیاده سازی امضا برای Commit های گیت می پردازیم

tooltip

شاید براتون جالب باشه که بدونید در سیستم Git نیز میتونیم از امضای الکترونیک منحصر به فرد خودمون استفاده کنیم.

مزایا

در هر ریپازیتوری تغییرات در قالب یک commit انجام می شوند. همچنین tag های مختلفی نیز داریم که تمام این ها قابلیت امضا شدن را دارند. احتمالا الان سوال می کنید که چرا باید چنین امضاهایی رو انجام بدیم ؟؟؟ به چه دردی میخوری ؟

وقتی شما یک Tag یا Commit را امضا می کنید برچسب تایید شده بهشون زده میشه. به این معنی که بقیه مطمئن میشن این تغییرات توسط منبع مطمئن و تایید شده ای که شما هستید اعمال شده. این امضا ها در کلیه سرور های گیت نیز ( مانند Github, Gitlab, ... ) شناسایی شده و به کاربران نشان داده میشه

tooltip

همچنین در زمان ثبت Pull Request ها هم این امضاها بررسی می شوند تا از صحت اعتبار درخواست دهنده اطمینان حاصل شود.

ساخت امضا

قبل از اینکه در git از امضا استفاده کنیم باید یک امضای دیجیتالی بسازیم. گیت از الگوریتم های مختلفی برای کلید های GPG پشتیبانی می کند از جمله :

  • RSA
  • ElGamal
  • DSA
  • ECDH
  • ECDSA
  • EdDSA

در صورتی که از الگوریتم های متفرقه ای استفاده کنید به احتمال زیاد به مشکل می خورید. برای ساخت امضای الکترونیک ابتدا ابزار GnuPG رو دانلود و نصب کنید و مراحل زیر رو انجام بدید :

  • یک ترمینال باز کنید
  • یک کلید جدید ایجاد کنید
$ gpg --full-generate-key
  • در هنگام ساخت کلید الگوریتم آن از شما پرسیده می شود که RSA را انتخاب کنید
  • در محله بعد اندازه کلید پرسیده می شود که باید حداقل 4096 باشد
  • سپس مدت اعتبار کلید پرسیده می شود که می توانید آن را به صورت نامحدود تنظیم نمایید
  • پس از آن باید برای ID خود یک آدرس ایمیل تنظیم کنید که حتما باید از آدرس ایمیل معتبر خود استفاده کنید. آدرسی که برای git خود نیز تنظیم کرده اید.
  • در آخرین مرحله نیز کلمه عبور مطمئن و پیچیده ای انتخاب نمایید

پس از طی مراحل بالا امضای دیجیتالی شما ساخته می شود. حال با استفاده از دستور زیر میتونید لیست کل کلید های ساخته شده را مشاهده کنید :

gpg --list-secret-keys --keyid-format LONG

خروجی به صورت زیر خواهد بود :

C:/Users/Arash/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
sec rsa4096/85F76C4F90C1E8F9 2020-04-01 [SCA]
0336B3B94982061A3A71A7C285F76C4F90C1E8F9
uid [ultimate] Arash Hatami <hatamiarash7@gmail.com>
ssb rsa4096/47E002F499C4F93B 2020-04-01 [E]

در خروجی بالا مقدار sec معرفی کننده امضا بوده که قسمت اول الگوریتم و سایز آن است

rsa4096

قسمت دوم نیز ID امضا است

85F76C4F90C1E8F9

حال برای دریافت کلید عمومی امضای خود مقدار بالا را کپی کرده و در دستور زیر قرار دهید :

gpg --armor --export 85F76C4F90C1E8F9

همانند کلید های SSH یک کلید عمومی در اختیار شما قرار می گیرد که می توانید از آن برای معرفی خود در پلتفرم های مختلف استفاده کنید ( ما در اینجا با git کار داریم )

استفاده از امضای دیجیتالی در Github

حال پس از اینکه کلید عمومی خودتون رو دارید ، ازش برای امضای دیجیتالی توی Github استفاده می کنیم

  • ابتدا وارد تنظیمات حساب کاربری بشید

tip

  • سپس گزینه SSH and GPG keys را انتخاب کنید

tip

  • روی دکمه New GPG key کلیک کنید تا یک کلید جدید ساخته شود

tip

  • حال در کادر مربوطه کلید عمومی را قرار دهید و کلید را بسازید

tip

تا اینجا کلید GPG خودتون رو ساختید و اون رو به Github نیز معرفی کردید. این کارو می تونید برای باقی موارد مانند Gitlab نیز انجام دهید تا خودتون رو به تمامی سرور های گیت مربوطه معرفی کنید.

هنوز یک مرحله باقی مانده است. از حالا به بعد باید تمام Commit ها و Tag ها رو توسط کلیدی که روی سیستم خودتون هست امضا کنید.

امضای Commit ها

حالا لازمه که به کلاینت git امضا رو معرفی کنیم. برای این کار از دستور زیر استفاده کنید و ID کلید رو تنظیم کنید :

git config --global user.signingkey 85F76C4F90C1E8F9

تنظیمات انجام شده و الان می تونید Commit های خودتون رو امضا کنید. برای این کار کافیه از آرگومان S- استفاده کنید

git commit -S -m "your commit message"

حالا وقتی تغییرات رو Push کنید ، میتونید با مراجعه به لیست Commit مشاهده کنید که امضای شما تایید شده و نمایش داده میشه

tip

مشکلات

این امضا کردن دوتا مشکل بزرگ داره.

مشکل اول

اول اینکه بر خلاف کلید SSH پس از هربار استفاده از امضای GPG باید رمز عبور تنظیم شده رو وارد کنید. این مورد یکم اذیت کننده است. چون به صورت پیشفرض Timeout خیلی کمی داره و تو یک روز کاری مدام باید رمز عبور وارد کنید. برای این کار روی سیستم عامل های مختلف روش های مختلفی هم هست. در اینجا من برای ویندوز توضیح میدم. هنگام نصب ابزار GnuPG در لیست ویژگی ها می تونید ابزار Kleopatra رو هم نصب کنید. این ابزار یه محیط گرافیکی خیلی کاربردی برای مدیریت کلید ها است ( و کلی قابلیت دیگه که اینجا در موردش صحبت نمی کنیم )

پس از اینکه ابزار رو باز کنید در صفحه اول لیستی از کل کلید ها بهتون نمایش داده میشه

tip

حالا با مراجعه به تنظیمات و بخش GnuPG System > Private keys تنظیمات Cache رو مشاهده می کنید که با افزایش این مقادیر دیگه از وارد کردن رمز عبور به تعداد زیاد خلاص میشید

tip

مشکل دوم

یه چیز دیگه که ممکنه آزار دهنده باشه اینه که باید برای هر Commit از آرگومان S- استفاده کنیم. این مورد زیاد جالب نیست و خب اگر از کلاینت های گرافیکی مانند Github Desktop استفاده کنیم دیگه به صورت پیشفرض امضا اعمال نمیشه. برای رفع این مشکل میتونیم تنظیمات git رو تغییر بدیم

فایل gitconfig./~ رو باز کنید و موارد زیر رو تنظیم کنید :

[commit]
gpgsign = true
[tag]
forceSignAnnotated = true
[alias]
logs = log --show-signature
cis = commit -S

دو مقدار اول به صورت پیشفرض امضا رو برای تمام commit و tag ها اعمال میکنه

در قسمت سوم ما alias های جدیدی برای git تنظیم میکنیم. یکی مخصوص log ها که مشخص می کنیم هنگام نمایش لاگ ها ، اطلاعات امضا هم نمایش داده بشه

و دیگری یک alias برای commit -S که معادل خلاصه شده اون رو در اختیارمون قرار میده و برای مثال چنین تبدیلی رخ میده :

git commit -S ==> git cis
git cis -m "your commit message"
danger

در سیستم عامل ویندوز اگر حین اجرای commit ها با خطای زیر مواجه شدید :

gpg: skipped "85F76C4F90C1E8F9": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object

برای رفع مشکل دستور زیر را اجرا کنید :

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe

اگر سوال یا مشکلی داشتید ، در تماس باشید