این یادداشت یک راهنما برای استفاده از GPG برای امضا کردن کامیتهای گیت است، اگر دنبال یک راهنمای نسبتا مفصل برای GPG هستید، خواندن این مطلب را توصیه میکنم: GPG یک راهنمای نسبتا مفصل
- GPG یا PGP چی هست اصلا؟
- ساختن کلید شخصی
- دادن کلید به گیت
- امضای کامیتها
- معرفی کلید به سرویسهایی مثل گیتهاب یا گیتلب
- کامیتهای تایید شده
برای شروع اجازه بدید پاراگراف اول از منبعی که در شروع یادداشت معرفی کردم رو کپی کنم:
GPG یا PGP چی هست اصلا؟
این یک الگوریتم رمز گذاری شخصی حساب میشه. در حقیقت 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: [email protected]
Comment:
You selected this USER-ID:
"kiavash <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
۸. یک پسورد خوب و قوی به کلید میدهیم.
۹. با کمک دستور زیر کلیدهایی که ساخته شده را میتوان دید.
gpg --list-secret-keys
دادن کلید به گیت
۱. با استفاده از دستور زیر مشخصات کاملی از کلیدهایی که ساختهایم را میتوانیم ببینیم:
gpg --list-secret-keys --keyid-format LONG [email protected]
نیاز به توضیح نیست که باید از آدرس ایمیلی که برای ساختن کلید خودتان استفاده کردهاید استفاده کنید.
۲. کلیدی که با sec
شروع شده است را پیدا کنید و GPG key ID
آنرا کپی کنید. در این مثال مقدار آن برابر با 30F2B65B9246B6CA
است:
sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid [ultimate] kiavash <[email protected]>
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://gitlab.com/help/user/project/repository/gpg_signed_commits/index.md
https://github.com/kiamazi/kiavash.one/blob/master/content/blog/2018-5-23-use-gpg-for-sign-commits.md
میتوانید آنرا ویرایش کنید. البته باید یادآوری کنم که هر ویرایشی قبل از اتشار نیاز به تایید دارد.
این وبلاگ از disqus برای سیستم نظردهی استفاده میکند، اگر فرم نظردادن را نمیبینید احتمالا کسی به جای شما تشخیص داده که این سرویس مناسبتان نیست و آن را از دسترس شما خارج کرده، برای نظردادن در این شرایط از ابزار رفع فیلتر استفاده کنید