این یادداشت یک راهنما برای استفاده از GPG برای امضا کردن کامیتهای گیت است، اگر دنبال یک راهنمای نسبتا مفصل برای GPG هستید، خواندن این مطلب را توصیه میکنم: GPG یک راهنمای نسبتا مفصل
برای شروع اجازه بدید پاراگراف اول از منبعی که در شروع یادداشت معرفی کردم رو کپی کنم:
این یک الگوریتم رمز گذاری شخصی حساب میشه. در حقیقت PGP اون الگوریتمه، و من از برنامه آزاد GPG برای مدیریتش استفاده میکنم. درسته که بگم این این کلید PGP منه، ولی حقیقت اینه که ناخواسته خیلی وقتا متوجه میشم که گفتم این کلید GPG منه، عمدی نیست ولی از لحاظ تکنیکی اگه اهل خورده گرفتن باشی غلط میتونه باشه.
۱. اگر gpg روی سیستمتون نصب نیست، باید دریافت و نصبش کنیم. برای تست دستور زیر رو اجرا میکنیم
gpg --version
اگر خروجی معتبری داشت که خیلی هم خوب، یعنی نیازی به نصب نداریم، اگر هم نه که از این آدرس دریافت و نصبش میکنیم.
۲. با استفاده از دستور زیر یک کلید خصوصی/عمومی میسازیم
gpg --full-gen-key
اجرای این دستور مجموعهای از سوالات رو به مانشون میده که با جواب دادن بهشون کلیدمون رو میسازیم. اگر سوالها رو بدون جواب دادن و تنها با زدن کلید اینتر رد کنیم جواب پیشفرض برای هر سوال انتخاب میشه.
۳. اولین سوال این است که از کدام الگوریتم میخواهید استفاده کنید. شماره ۱ رو انتخاب میکنیم.
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? 1
۴. سوال بعد در مورد طول رشتهی کلید است، هرچه کلید طولانیتر، امنتر :) مقدار ۴۰۹۶ رو به عنوان طول رشته انتخاب میکنیم.
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits
۵. سوال بعدی که پرسیده میشود، مدت زمان اعتبار کلید است، که ما گزینهی اعتبار همیشگی یا «بدون تاریخ انقضا» رو انتخاب میکنیم. جواب گزینهی ۰ است.
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) 0 Key does not expire at all
۶. جوابها رو تایید میکنیم.
Is this correct? (y/N) y
۷. نامی که برای امضای کلیدها قرار است استفاده شود و آدرس ایمیل را وارد میکنیم. از آنجا که میخواهیم با کمک این کلید کامیتهای گیت را امضا کنیم، بهتر است با نام و آدرس ایمیلی که به تنظیمات گیت داده شده یکی باشد. سوال آخر را هم با وارد کردن گزینهی O و تایید مشخصات جواب میدهیم.
GnuPG needs to construct a user ID to identify your key. Real name: kiavash Email address: me@kiavash.one Comment: You selected this USER-ID: "kiavash <me@kiavash.one>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
۸. یک پسورد خوب و قوی به کلید میدهیم.
۹. با کمک دستور زیر کلیدهایی که ساخته شده را میتوان دید.
gpg --list-secret-keys
۱. با استفاده از دستور زیر مشخصات کاملی از کلیدهایی که ساختهایم را میتوانیم ببینیم:
gpg --list-secret-keys --keyid-format LONG me@kiavash.one
نیاز به توضیح نیست که باید از آدرس ایمیلی که برای ساختن کلید خودتان استفاده کردهاید استفاده کنید.
۲. کلیدی که با sec
شروع شده است را پیدا کنید و GPG key ID
آنرا کپی کنید. در این مثال مقدار آن برابر با 30F2B65B9246B6CA
است:
sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC] D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA uid [ultimate] kiavash <me@kiavash.one> ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
۳. برای گیت مشخص کنید که کامیتها را با کمک این کلید امضا کند
git config --global user.signingkey 30F2B65B9246B6CA
(مقدار ID که از مرحله قبل به دست آوردید را جایگزین مقدار پیشفرض در این مثال 30F2B65B9246B6CA
باید بکنید)
بعد از ساختن کلید GPG و دادن مقدار آن به گیت میتوانید شروع به امضا کردن کامیتهایتان بکنید. چند راه برای اینکار داریم
۱. راه ول استفاده از سوییچ -S
برای امضا کردن هر کامیت است
git commit -S -m "My commit msg"
۲. اگر نمیخواهیم بعد از هر بار کامیت کردن از سوییچ S استفاده کنیم، میتوان برای گیت مشخص کرد که بعد از هر بار کامیت کردن آنها را اتوماتیک امضا کند
git config --global commit.gpgsign true
۳. در هر دو حالت بعد از هر بار کامیت کردن باید پسورد کلید را وارد کنیم، البته امروزه اکثر سیستمعاملها برنامههای پیشفرضی به همراه دارند که میتوانند این پسورد را در خود ذخیره کنند و نیاز به تایپ پسورد در هر سری را از بین ببرند. اگر مطمین هستید که کسی جز شما از کامپیوترتان استفاده نمیکند میتوانید پسورد را ذخیره کنید. من این کار را نمیکنم
۱. از کلید عمومی با کمک دستور زیر میتوان خروجی گرفت(ID خودتان را جایگزین مقدار پیشفرض این مثال باید بکنید)
gpg --armor --export 30F2B65B9246B6CA
۲. مقدار خروجی را کپی کنید. خروجی شبیه به این خواهد بود:
-----BEGIN PGP PUBLIC KEY BLOCK----- blahblahblah blahblahblah ... ... ... -----END PGP PUBLIC KEY BLOCK-----
۳. به قسمت تنظیمات اکانت در سرویس مورد نظر میرویم، در گیتهاب به قسمت SSH and GPG keys
یا در گیتلب GPG keys
میرویم و مقدار کلید عمومی را در آن کپی میکنیم.
۱. به زبانهی commits هر مخزن در سرویس مورد نظر که برویم، به راحتی میتوان کامیتهای امضا شدهی معتبر، نامعتبر و کلا امضا نشدهها را از هم تشخیص داد.
۲. با کلیک بر روی نشان امضای هر کلید میتوان مشخصات آنرا دید
آدرس این یادداشت بر روی وبلاگ شخصی کیاوش
https://kiavash.one/2018/05/23/use-gpg-for-sign-commits/
در صورتیکه بخواهید به هر شکلی در نوشتن این یادداشت مشارکت کنید، مثلا آن را اصلاح کنید یا مطلبی به آن اضافه کنید، منبع این یادداشت روی گیتهاب در این آدرس در دسترس است:
https://github.com/kiamazi/kiavash.one/blob/master/content/blog/2018-5-23-use-gpg-for-sign-commits.md
میتوانید آنرا ویرایش کنید. البته باید یادآوری کنم که هر ویرایشی قبل از اتشار نیاز به تایید دارد.
منبع ۳عکس آخر و مقادیر پیشفرض مثالها:
https://gitlab.com/help/user/project/repository/gpg_signed_commits/index.md