امضای کامیت‌های گیت با استفاده از کلید GPG

این یادداشت یک راهنما برای استفاده از GPG برای امضا کردن کامیت‌های گیت است، اگر دنبال یک راهنمای نسبتا مفصل برای GPG هستید، خواندن این مطلب را توصیه می‌کنم: GPG یک راهنمای نسبتا مفصلبرای شروع اجازه بدید پاراگراف اول از منبعی که در شروع یادداشت معرفی کردم رو کپی کنم: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: me@kiavash.one Comment: You selected this USER-ID: &quotkiavash <me@kiavash.one>&quot 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 &quotMy commit msg&quot۲. اگر نمی‌خواهیم بعد از هر بار کامیت کردن از سوییچ 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