اضافه کردن امضای دیجیتالی به commitها در گیت‌هاب

?How to Add Digital Signatures to Commits in GitHub

اضافه کردن امضای دیجیتالی به commit ها در گیت هاب

همانطور که می دانید در دنیای امروز توسعه وب git و GitHub بخشی جدا نشدنی هستند و هر برنامه ای از هر نوع که باشد حداقل با گیت مدیریت خواهد شد. مسئله اصلی اینجاست که گیت هیچ سیستم احراز هویتی ندارد بلکه بر اساس ایمیل کار می کند بنابراین می توانید از ایمیل دیگران برای commit کردن کدهای خود استفاده کنید.

اگر تیتر اخبار تکنولوژی را دنبال کرده باشید در سال گذشته چندین حمله جعل هویت در گیت انجام شده است و به همین خاطر امضا کردن commit ها ارزش زیادی دارد. ما در این مقاله درباره امضا کردن commit ها و نحوه انجام آن صحبت خواهیم کرد.

قابل توجه کاربران ویندوز: برای همراهی با این مقاله باید ترمینال خاصی به نام git for windows را نصب کنید. این ترمینال کار اجرای دستورات git را بسیار آسان تر می کند. هر جایی از این مقاله که عبارت ترمینال را دیدید،‌ بدانید که منظور من git for windows است.

سطوح و نحوه پیکربندی در گیت

برای امضا کردن commit ها ابتدا باید در رابطه با نحوه پیکربندی در گیت صحبت کنیم. در گیت سه سطح مختلف برای در نظر گرفتن تنظیمات پیکربندی داریم:

  • سطح محلی یا local: در این حالت یک فایل به شکل git/config. در مسیر اصلی پروژه خواهیم داشت که تنظیمات پیکربندی گیت را در خود دارد. این تنظیمات فقط روی همان پروژه اعمال خواهند شد.
  • سطح سیستم یا system: این تنظیمات روی تمام کاربران یک سیستم اعمال شده و ممکن است تنظیمات دیگر را نادیده بگیرند. تنظیمات سیستمی معمولا در مسیر etc/gitconfig لینوکس ذخیره می شوند.
  • سطح سراسری یا global: این تنظیمات روی یک کاربر خاص در سیستم اعمال می شوند و معمولا در آدرس gitconfig./~ قرار دارند.

زمانی که برای اولین بار گیت را نصب می کنید باید آن را پیکربندی کنید، یعنی آدرس ایمیل و نامتان را به آن بدهید. از آنجایی که سطح global رایج ترین سطح برای اعمال پیکربندی در گیت است من از آن استفاده می کنم.

شما برای پیکربندی اولیه گیت باید دستورات زیر را به ترتیب در ترمینال اجرا کنید:

git config --global user.name "Your name here"

git config --global user.email "your_email@example.com"

دستور اول نام شما را مشخص می کند بنابراین باید به جای Your name here نام خودتان را تایپ کنید. دستور دوم نیز ایمیل شما را مشخص می کند و باید به جای your_email@example.com ایمیل واقعی خودتان را وارد کنید.

من شخصا علاوه بر دستورات بالا، دو دستور زیر را نیز اجرا می کنم:

git config --global color.ui true

git config --global core.editor code

دستور اول می گوید که در هنگام نمایش نتایج در ترمینال از رنگ استفاده کند تا ظاهر خروجی زیباتر شود. دستور دوم مشخص می کند که ویرایشگر ما به صورت پیش فرض چه ویرایشگری باشد. من code را انتخاب کرده ام که همان Visual Studio Code است. طبیعتا شما می توانید هر ویرایشگر دیگری مانند Atom یا Vim یا Nano و غیره را انتخاب کنید.

حالا برای نمایش تنظیمات پیکربندی خود می توانید فایل متنی gifconfig را باز کنید. این فایل در سیستم های لینوکس در مسیر Home (آدرس gitconfig./~) قرار دارد اما در ویندوز در مسیر C:\ProgramData\Git\config جای گرفته است. محتویات این فایل برای من به شکل زیر است:

[user]

                email = *************@*****.***

                signingkey = ************

                name = Amir Zouerami

               

[diff]

    tool = default-difftool

[difftool "default-difftool"]

    cmd = code --wait --diff $LOCAL $REMOTE

[commit]

                gpgsign = true

[core]

                editor = code --wait

[color]

                ui = true

من ایمیل و signingkey را مخفی کرده ام چرا که خصوصی هستند و نباید در اختیار دیگران قرار بگیرند اما می توانید دیگر تنظیمات من را مشاهده کنید. من چند گزینه اضافه مانند difftool را نیز دارم که اگر با گیت آشنا باشید می دانید برای چه هستند. مثلا اگر کلید دیجیتال نداشته باشید قسمت  signingkey برای شما وجود ندارد اما جای نگرانی نیست ما در این مقاله این موضوع را بررسی می کنیم.

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

وضعیت تایید در commit ها با Vigilant mode

commit signature verification یا تایید امضای commit قابلیت محبوبی در گیت هاب است که با استفاده از یک کلید دیجیتال commit های شما را امضا می کند بنابراین زمانی که کدهایتان را در گیت هاب قرار می دهید یک علامت verified (به معنی «تایید شده») را در کنار آن commit مشاهده می کنید.

علامت  verified در کنار commit ثبت شده
علامت  verified در کنار commit ثبت شده

بدین شکل افراد دیگر می توانند مطمئن شوند که این کدها حتما توسط شخص شما نوشته شده است و کسی با استفاده از ایمیل شما هویت خود را جعل نکرده است. چطور؟ به دلیل اینکه هیچکس به جز شما و گیت هاب این کلید دیجیتال را ندارد بنابراین هر commit ای که با این کلید امضا شود قطعا متعلق به شما است.

اگر گیت هاب نتواند با کلیدی که از شما دریافت کرده است یک commit را تایید کند عبارت unverified (به معنی «تایید نشده») در کنار آن commit نمایش داده می شود اما اگر اصلا کلیدی به گیت هاب نداده باشید، هیچ وضعیتی برای آن commit نمایش داده نمی شود. این رفتار امن نیست بنابراین گیت هاب جدیدا قابلیتی به نام Vigilant mode را معرفی کرده است که اگر آن را فعال کنید وضعیت تمام commit های شما نمایش داده می شوند، چه کلیدی به گیت هاب داده باشید و چه نداده باشید.

سه وضعیت ممکن با فعال بودن  Vigilant mode
سه وضعیت ممکن با فعال بودن  Vigilant mode
  • Verified (به معنی «تایید شده») یعنی commit شما امضا شده و با موفقیت تایید شده است.
  • Partially verified (به معنی «تایید جزئی») یعنی commit شما امضا شده و با موفقیت تایید شده است اما فردی که آن commit را ثبت کرده است صاحب کلید نیست و همچنین vigilant mode را نیز فعال کرده است.
  • Unverified (به معنی «تایید نشده») به معنی یکی از این سه حالت است: حالت اول اینکه commit شما امضا شده اما آن امضا قابل تایید نیست. حالت دوم اینکه commit امضا نشده و ثبت کننده آن commit حالت vigilant mode را فعال کرده است. حالت سوم اینکه commit شما امضا نشده و نویسنده اصلی آن commit حالت  vigilant mode را فعال کرده است.

برای فعال کردن حالت vigilant mode روی آیکون پروفایل خود در گیت هاب کلیک کرده و گزینه settings را انتخاب کنید:

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

در صفحه تنظیمات به بخش SSH and GPG keys رفته و از آنجا گزینه vigilant mode را فعال کنید:

فعال کردن قابلیت vigilant mode
فعال کردن قابلیت vigilant mode

حالا که این حالت را فعال کرده ایم باید یک کلید دیجیتال ایجاد کرده و commit هایمان را با آن امضا کنیم.

کلیدهای GPG و نصب آن

گیت هاب از کلیدهای GPG برای امضا کردن commit ها استفاده می کند. GPG مخفف GNU Privacy Guard (محافظ امنیت گنو) و نام یک نرم افزار رمزنگاری است. در واقع GPG یک نوع الگوریتم خاص خودش را برای پیاده سازی کلیدهای دیجیتال دارد (الگوریتم های دیگری نیز وجود دارند اما همانطور که گفتم گیت هاب از GPG استفاده می کند).

قابل توجه کاربران ویندوز: ویندوز به صورت پیش فرض برنامه GPG را ندارد بنابراین باید ابتدا به آدرس www.gnupg.org/download رفته و آن را دانلود و نصب کنید. در این صفحه گزینه ای به نام Gpg4win وجود دارد که با کلیک روی آن به صفحه دانلود GPG برای ویندوز منتقل می شوید. پس از نصب، آدرس نصب آن (معمولا C:\Program Files\GnuPG) را به PATH سیستم خود اضافه کنید تا بتوانید آن را در ترمینال اجرا کنید. حالا یک ترمینال جدید باز کرده و دستور gpg --version را در آن اجرا کنید. اگر خطا دریافت کردید یعنی GPG را به درستی به PATH ویندوز اضافه نکرده اید اما اگر نتیجه زیر را دیدید یعنی همه چیز با موفقیت نصب شده است:

gpg (GnuPG) 2.2.20

libgcrypt 1.8.7

Copyright (C) 2020 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.




Home: /home/amir/.gnupg

Supported algorithms:

Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA

Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,

        CAMELLIA128, CAMELLIA192, CAMELLIA256

Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224

Compression: Uncompressed, ZIP, ZLIB, BZIP2

کاربران لینوکس GPG را از قبل به صورت نصب شده دارند بنابراین نیازی به انجام کار خاصی نیست.

وجود کلیدهای قبلی

قبل از اینکه بخواهیم یک کلید GPG تولید کنیم بهتر است وجود چنین کلیدی را در سیستم خودمان بررسی کنیم تا از قبل آن را نساخته باشیم. برای انجام این کار دستور زیر را در ترمینال خود اجرا کنید:

gpg --list-secret-keys --keyid-format=long

اگر از قبل کلید GPG داشته باشید، با اجرای دستور بالا آن کلید به شما نشان داده می شود اما اگر کلیدی نداشته باشید هیچ چیزی نمایش داده نمی شود و یا اینکه پیامی مبنی بر عدم وجود کلید GPG دریافت می کنید. اگر کلید GPG دارید می توانید مستقیما به بخش «اضافه کردن کلید GPG به گیت هاب» بروید اما اگر کلید GPG ندارید و یا اینکه می خواهید یک کلید GPG جدید تولید کنید به بخش «تولید کلید GPG» مراجعه کنید.

تایید ایمیل در گیت هاب

قبل از آنکه بخواهید کلید GPG را تولید کنید باید مطمئن شوید که ایمیل شما در گیت هاب تایید شده (verified) است چرا که بدون ایمیل تایید شده اجازه امضا کردن commit ها را ندارید. برای انجام این کار روی پروفایل خود کلیک کرده و به بخش settings بروید. در آن صفحه به بخش emails رفته و وضعیت ایمیل خود را چک کنید:

نمونه ای از یک ایمیل تایید نشده
نمونه ای از یک ایمیل تایید نشده

اگر ایمیل شما مانند ایمیل تصویر بالا تایید نشده بود باید روی دکمه Resend verification email کلیک کرده و سپس به ایمیل خود بروید و روی لینک ارسال شده کلیک کنید. با این کار ایمیل شما تایید می شود.

قابلیت جالبی در گیت هاب وجود دارد که باید آن را در این بخش توضیح بدهم. همانطور که در ابتدای این مقاله دیدید، برای پیکربندی گیت نیاز به یک ایمیل دارید و طبیعتا زمانی که commit انجام می دهید، این ایمیل در آن commit ثبت می شود و دیگران می توانند به راحتی آن را ببینند. اگر دوست ندارید دیگران ایمیل شما را ببینند، در همین صفحه تنظیمات Emails، یک ایمیل ناشناس از سمت گیت هاب برایتان تولید می شود که می توانید از آن استفاده کنید:

ایمیل ناشناس تولید شده توسط گیت هاب
ایمیل ناشناس تولید شده توسط گیت هاب

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

git config --global user.email "********+Amir-*****@users.noreply.github.com"

با انجام این کار فقط گیت هاب ایمیل اصلی شما را دارد و commit ها با این ایمیل ناشناس ثبت می شوند.

تولید کلید GPG

گیت هاب از الگوریتم های زیر برای تولید کلید GPG پشتیبانی می کند:

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

اگر کلید شما با الگوریتمی غیر از یکی از الگوریتم های بالا تولید شده باشد، گیت هاب درخواست شما را در خواهد کرد.

اگر از نسخه 2.1.17 یا نسخه های جدید تر GPG استفاده می کنید باید دستور زیر را در ترمینال اجرا کنید:

gpg --full-generate-key

با اجرای این دستور چند سوال از شما پرسیده می شود که بر اساس نسخه GPG نصب شده در سیستم شما ممکن است کمی تفاوت داشته باشند (مثلا در جمله بندی متفاوت باشند) اما کلیت آن ها عینا یکی است. اولین سوال به شکل زیر است:

Please select what kind of key you want:

   (1) RSA and RSA (default)

   (2) DSA and Elgamal

   (3) DSA (sign only)

   (4) RSA (sign only)

Your selection?

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

RSA keys may be between 1024 and 4096 bits long.

What keysize do you want? (2048)

کلیدهای RSA اندازه ای بین 1024 تا 4096 بیت دارند و مقدار پیش فرض 2048 می باشد. گیت هاب هیچ کلیدی زیر 4096 بیت را قبول نمی کند بنابراین عدد 4096 را تایپ کرده و enter بزنید. در مرحله بعدی از شما پرسیده می شود طول عمر این کلید باید چقدر باشد:

Please specify how long the key should be valid.

         0 = key does not expire

      <n>  = key expires in n days

      <n>w = key expires in n weeks

      <n>m = key expires in n months

      <n>y = key expires in n years

Key is valid for? (0)

طبیعتا ما نمی خواهیم کلیدمان منقضی شود بنابراین عدد صفر را تایپ کرده و enter می زنیم. عدد صفر یعنی کلید منقضی نشود. ممکن است در یکی از این بخش ها از شما پرسیده شود که یک passphrase (رمز عبور) را انتخاب نمایید. در این حالت سعی کنید یک رمز طولانی و مناسب را انتخاب کنید.

در نهایت سوال آخر از شما پرسیده می شود:

GnuPG needs to construct a user ID to identify your key.




Real name: Best User

Email address: bestuser@example.com

Comment: Best Company

You selected this USER-ID:

    "Best User (Best Company) <bestuser@example.com>"




Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

همانطور که می بینید من گزینه های این سوال را به صورت نمایشی پر کرده ام. بیایید این گزینه ها را بررسی کنیم:

  • Real name: نام خود را وارد کنید. سعی کنید عینا همان نامی را انتخاب کنید که به گیت هاب داده اید.
  • Email address: آدرس ایمیل را وارد کنید که در فایل gitconfig وجود دارد. یعنی همان ایمیلی که با دستور git config --global user.email ثبت کردید. اگر از ایمیل ناشناس گیت هاب استفاده کرده اید باید همان را در این بخش وارد کنید.
  • Comment: توضیحاتی راجع به این کلید بنویسید تا اگر در آینده به آن برگشتید بدانید این کلید برای چه کاری است. من عبارت MY GPG KEY FOR SIGNING GITHUB COMMITS را در آن نوشته ام اما شما می توانید هر عبارت دیگری را بنویسید.

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

طبیعتا بخش های مختلف این تصویر با کلید تولید شده برای شما متفاوت خواهد بود. این تصویر فقط به عنوان یک مثال آورده شده است
طبیعتا بخش های مختلف این تصویر با کلید تولید شده برای شما متفاوت خواهد بود. این تصویر فقط به عنوان یک مثال آورده شده است

اگر از نسخه های قدیمی تر GPG استفاده می کنید باید به جای دستور بالا، دستور زیر را اجرا کنید:

gpg --default-new-key-algo rsa4096 --gen-key

نکته: برای بررسی نسخه GPG دستور gpg --version را در ترمینال اجرا کنید.

پس از تولید کلید GPG با اجرای دستور زیر می توانید آن را مشاهده کنید:

gpg --list-secret-keys --keyid-format=long

خروجی این دستور چیزی شبیه به اطلاعات زیر است:

/Users/hubot/.gnupg/secring.gpg

------------------------------------

sec   4096R/3AA5C34371567BD2 2022-03-10 [expires: 2017-03-10]

uid                          Hubot

ssb   4096R/42B317FD4BA89E7A 2022-03-10

از این بخش ID کلید GPG را کپی کنید. ID کلید بالا همان 3AA5C34371567BD2 است (در بخش sec). حالا این id را در دستور زیر استفاده می کنیم:

gpg --armor --export 3AA5C34371567BD2

با اجرای این دستور، کل کلید RSA برایتان چاپ می شود که ساختار زیر را دارد:

-----BEGIN PGP PUBLIC KEY BLOCK-----

// چند صد کاراکتر

-----END PGP PUBLIC KEY BLOCK-----

این کلید GPG شما است.

اضافه کردن کلید GPG به گیت هاب

برای اضافه کردن این کلید به گیت هاب ابتدا از بخش تنظیمات (setting) روی گزینه SSH and GPG keys کلیک کنید:

بخش کلید های SSH در تنظیمات گیت هاب
بخش کلیدهای SSH در تنظیمات گیت هاب

سپس در صفحه باز شده روی گزینه New GPG key کلیک نمایید:

اضافه کردن کلید GPG
اضافه کردن کلید GPG

و در نهایت کل کلید خود (به همراه قسمت های -----BEGIN PGP PUBLIC KEY BLOCK----- و-----END PGP PUBLIC KEY BLOCK-----) را کپی کرده و درون کادر نمایش داده شده قرار بدهید. حالا می توانید روی گزینه Add GPG key کلیک کنید تا این کلید به حسابتان اضافه شود.

امضا کردن commit ها

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

gpg --list-secret-keys --keyid-format=long

خروجی این دستور چیزی شبیه به خروجی زیر خواهد بود:

/Users/hubot/.gnupg/secring.gpg

------------------------------------

sec   4096R/3AA5C34371567BD2 2022-03-10 [expires: 2017-03-10]

uid                          Hubot

ssb   4096R/42B317FD4BA89E7A 2022-03-10

با این حساب ID کلید ما 3AA5C34371567BD2 می باشد که در نتیجه بالا نمایش داده شده است. ما این کلید را با دستور زیر به گیت اضافه می کنیم:

git config --global user.signingkey 3AA5C34371567BD2

اگر از کاربران لینوکس هستید، دستور زیر را نیز اجرا نمایید:

if [ -r ~/.bash_profile ]; then echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile; \

  else echo 'export GPG_TTY=$(tty)' >> ~/.profile; fi

این دستور کلید را به bash_profile شما اضافه می کند.

از این به بعد برای امضا کردن commit ها باید پارامتر S- را نیز به دستور commit اضافه کنید. مثلا:

git commit -S -m your commit message

اما اگر می خواهید امضا کردن به صورت خودکار برای تمام commit ها اتفاق بیفتد (که روش پیشنهادی است) دستور زیر را در ترمینال خود اجرا کنید:

git config --global commit.gpgsign true

امضا کردن tag ها در گیت نیز به همین شکل است:

git tag -s mytag

امیدوارم این مقاله به امنیت پروژه های شما کمک کرده باشد.

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو