GPG یک راهنمای نسبتا مفصل

GPG یا PGP چی هست اصلا؟

این یک الگوریتم رمز گذاری شخصی حساب میشه. در حقیقت PGP اون الگوریتمه، و من از برنامه آزاد GPG برای مدیریتش استفاده میکنم. درسته که بگم این این کلید PGP منه، ولی حقیقت اینه که ناخواسته خیلی وقتا متوجه میشم که گفتم این کلید GPG منه، عمدی نیست ولی از لحاظ تکنیکی اگه اهل خورده گرفتن باشی غلط میتونه باشه.

من سعی دارم تو این نوشته، توضیح بدم که چطور میشه یه کلید ساخت و مطمئن شد که امنه. این روش منه، روشی که من بعد از یکی دو سال رسیدم بهش، ولی دلیل نمیشه که این روش کامل باشه. روشی شما ممکنه متفاوت باشه و برای شما ایده‌آل تر باشه، پس اگه جایی به نظرتون غلط بود بگید حتما تا اصلاح کنم، ولی اگه به اندازه کافی ایده آل شما نبود، خوشحال میشم که بشنوم روشتونو، ولی ممکنه که اعمال نکنم اون تغییری که به نظر شما این مطلب رو ایده‌آل میکنه :)

از کجا شروع کنم؟

مطمئن بشید که نسخه آخر gpg روی سیستم شما نصبه. الان و در زمان نوشتن این نوشته نسخه ۲.۱.۱۱ آخرین نسخه رسمی gpg توی سایتشه. البته نسخه کلاسیک هم هست و نسخه استیبل، که خوب من همیشه دوست دارم لبه باشم.

gpg --version
gpg (GnuPG) 2.1.11
libgcrypt 1.6.5
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.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

تو این سیستم، یک کلید عمومی وجود داره و یک کلید خصوصی. مشخصه که کلید عمومی رو میشه خیلی راحت انتشار داد و در اختیار عموم گذاشت. ولی تکلیف کلید خصوصی مشخص تره. این کلید نباید تحت هیچ شرایطی بره رو اینترنت :)‌کلا هیچ جا نبریتش، ایده آل ترین جا براش یک سیستم کاملا ایزولست که اصلا به اینترنت دسترسی نداشته باشه. منتها چطور ازش استفاده کنیم اونوقت؟ مثلا من همه کامیتهام توی git رو ساین میکنم. اینجوری باید هر کامیت رو ببرم روی اون ماشین ایزوله و ساین کنم و برگردونم؟ قطعا نه. تو اینجا من سعی میکنم که روش رو توضیح بدم که هم کلید شما امن باشه و هم اینکه شما بتونید بی دردسر از کلیدتون استفاده کنید.

خوب قدم به قدم بریم جلو حتمالا خیلی بهتر میشه :)

ساخت یک کلید امن، قدم به قدم

ساخت کلید

برای ساخت کلید، gpg --full-gen-key کمکتون میکنه. – برای اینکه پروسه زدن رمز مشخص نبود توی اسکی نما، دوباره دارم رکورد میکنم اونها رو با‍ pinentry-course و داخل داکر. داکر دبیان هم دارم که gpg اصلیش نسخه ۱ ـه و من نسخه ۲ رو جدا گانه نصب کردم که قدیمیتر از ۲.۱.۱۱ است و دستور --full-gen-key رو نداره. برای همین --gen-key رو استفاده میکنم.

من همه جوابها رو کامل دادم، حتی اونها که جواب پیشفرضشون درست بود. مراحل سادست. اول الگوریتم رو انتخاب میکنیم که پیشفرضش خوبه، بعد میگه که اندازه کلیدی RSA رو بگو. پیشفرض خودش ۲۰۴۸ رو انتخاب نکنید. این کلید هر چی بلند تر باشه امنتره. گام بعدی اینه که ازتون میپرسه میخواید این کلید چند وقت معتبر باشه. من زدم برای همیشه، این خیلی بهتره. در حقیقت کلید اصلی رو به برای همیشه انتخاب میکنیم، کلید های بعدی که به عنوان sub key سا همون زیر کلید استفاده میشن رو،‌با زمانهای کمتر درست خواهیم کرد :) گامهای بعدی هم که اسم و مشخصاتتون رو میپرسه که خوب شما مشخصات خودتون رو میزنید طبیعتا. یک ایمیل هم اینجا میخواد که شما ایمیل اصلیتون رو بزنید، ایمیلهای دیگه رو هم میشه بعدا اضافه کرد.

بعدش از شما رمز میخواد. بسته به pinentry نصب شده روی سیستم شما، این گرفتن رمز ممکنه با روش متفاوتی از شما گرفته بشه. برای من توی X11 گرفته میشه (رکورد جدید توی داکره و توی ترمینال گرفته میشه رمز) ولی میتونید ‍‍pinentry-curses رو تنظیم کنید تا اونم توی ترمینال باشه که خوب برای من زیاد مهم نیست :)

یه نکته دیگه. اگه کار وقت گیری دارید، مثلا کپی کردن و اپتیمایز کردن هاردتون، یا هر کار دیگه ای که میتونه بی نظمی تولید کنه، بهترین وقتش همین موقع است. هر چی سر سیستموتون شلوغ باشه کلید رندومی که تولید میکنه اعتبار بیشتری داره. یعنی رندوم تره :) -خیلی عبارت مسخره ایه رندوم تر!-

کامپیوتر معمولا تو یه سری رندوم درست میکنه. من بارها سر ملت رو با این روش کلاه گذاشتم :) مثلا یه برنامه بود که رندم یه نفر رو انتخب میکرد که بره ظرف بشوره تو خوابگاهمون با هم اتاقی ها. من همیشه طوری سید رو تغییر میدادم که خودم انتخاب نشم، مگه روزهایی که ظرفها کم بود.

اینطوری، در زمانی که gpg داره کلید رندوم رو برای شما ایجاد میکنه، کلی کلید رندوم صرف برنامه های دیگه میشن، و رندومهای استفاده شده تو یه سری پشت سر هم درنمیان، البته خود gpg به این بسنده نمیکنه و کلی کلک دیگه هم میزنه که قطعا هر چی این بی نظمی بیشتر باشه تو سیستم شما، کلید تولید شده امنیت بیشتری داره.

این کلید ،کلید اصلی شماست. همون کلیدی که باید بذاریتش تو صندوق کلیدشم قورت بدید :)

یه سری کارهای دیگه هم هست، مثلا اینکه عکس اضافه کنید یا اینکه الگوریتم هش رو تغییر بدید به یه روش قدرتمندتر، اینها رو من بعدا اضافه میکنم به همین پست :) شاید هم آخرش این متن رو عوض کردم :)

اضافه کردن زیر کلید (subkey)

مساله از همینجا شروع میشه. من میخوام کلیدم رو ببرم رو سیستم شرکت که کمتر از لپتاپ خودم به امنیتش اطمینان دارم. یا اصلا اگه لپتاپم و دزدیدن چی؟

بهترین کار اینه که یه زیر کلید اضافه کنیم به این کلید، بعد یه جوری یه نسخه ازش تهیه کنیم که کلید اصلی توش نباشه. نسخه کاملش رو بفرستیم یه جای امن، و این نسخه جدید رو استفاده کنیم. علاوه بر این یه روشی هم داشته باشیم که بتونیم اون کلید رو هم provoke کنیم وقتی لازم شد.

خوب اول یه subkey من معمولا از این کلید برای ساین کردن کامیتها و تگها استفاده میکنم توی git. خوب پس یه کلید میخوام برای امضا کردن. ممکنه یه جایی برای encrypt کردن بخواید استفاده کنید ازش، همین مراحل رو میتونید برای اونکار هم انجام بدید.

اول کلید رو برای ویرایش باز کنید. ‍‍gpg --edit-key [email protected] این همون آدرس ایمیلیه که توی قسمت ساخت کلید زدید.

گام اول اینه که توی ترمینالی که gpg‍‍ در اختیارتون میذاره، addkey رو تایپ کنید. اول ازتون میپرسه چه کلیدی میخواید و برای چه کاری. من برای امضا کردن میخوام، پس (4) RSA (sign only ) رو با زدن کلید ۴ انتخاب میکنم.

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

بعدش از شما یه سری رمز میپرسه. الیش که رمز کلید تازه ایجاد شدست. بعد ممکنه رمز کلید اصلی رو بپرسه. مثلا برای من نپرسید، چون من gpg-agent روی لپتاپم در حال اجرا بود و تا یه مدتی دیگه رمز نمیپرسه برای کلید. دقت کنید قاعدتا اینوریه که اول رمز کلید جدید رو میگیره، بعد رمز کلید اصلی رو میپرسه، و بعد مجددا رمز کلید جدید رو هم میپرسه.

گام آخر این که توی ترمینال بنویسید save و کلید رو ذخیره کنید. حالا یک کلید برای ساین دارید که به جای کلید اصلی از اون استفاده مشه. یعنی هر وقت برای ساین از شما رمز بخواد، رمز این کلید رو میزنید نه رمز کلید اصلی رو .

گواهی فوت؟؟

حالا میرسیم به این بحث که اگه کلید دزدیده شد چکار کنم؟ اگه کلید دوم دزدیده بشه و شما همچنان اصلی رو داشته باشید به راحتی میشه کلید رو revoke کرد، ولی اگه کلید اصلی دزدیده بشه، چی؟

برای اینکار یه ‍‍revocation certificate درست میکنیم. دقیقا مثل بیمست :) که میگن امیدوارم هیچوقت مورد استفادتون نشه :))))) ولی خوب به هر حال.

gpg --output gpg-revocation-certificate-fzero-rubi-gd --gen-revoke [email protected] 

اسم فایل خروجی مهم نیست، ولی آدرس ایمیل، همونیه که برای ساختش استفاده کردید.

خوب این یه فایله که اگه به اندازه من حساسیت داشته باشید، پرینتش میکنید و یه جا توی یکی از کتابهاتون مخفیش میکنید. خودش هم ممکنه یه جایی نگه دارید، ول قطعا اون یه جا توی اینترنت نیست!!! یا حتی توی یه جایی که ظاهرا امنه مثل mega یا هر چیز مشابه دیگه ای. بهترین کاری که میشه کرد اینه که از اینترنت دورش کنید. و البته طبیعتا اینو کنار کلید اصلی - که به زودی میگم چجوری اون رو هم export کنید، قرار ندید. چون این قراره که در صورت گم شدن اون، ازش محافظت کنه، نه که خودشم باهاش گم بشه :)

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

خروجی کلید ها

حالا وقت خروجی گرفتن از کلیدهاست. اول کلید عمومی :

gpg --export --armor [email protected] > public-gpg-key-fzero-rubi-gd.public

آدرس فایل رو هر چی میخواید بدید. من برای خودم یه کانونشن دارم که کلید های عمومی رو با پسوند ‍public و کلید های خصوصی رو با پسوند private ازشون export میگیرم.

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

خوب گام مهم، گرفتن کلید اختصاصی شماست.

gpg --export-secret-keys --armor [email protected] > private-gpg-key-fzeo-rubi-gd.private

این اول رمز کلید اصلی رو میپرسه، بعد به ازای تک تک زیرکلیدهایی که ساختید ازتون رمز میپرسه.

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

حذف کلید اصلی (master)

خوب این فایل اصلی که قراره تو یه جای امن ذخیره بشه. گام بعدی حذف کلید اصلی از این سیستم و ایجد یه کلید gpg بدون کلید اصلی ولی همچنان با قابلیت امضا و/یا کدگذاریه.

export subkey

gpg --export-secret-subkeys [email protected] > subkey-temporary

اول رمز کلید اصلی رو بزنید بعد رمز زیرکلیدها رو.

گام بعدی حذف کلید اصلی

gpg --delete-secret-key [email protected]

چندین و چند بار ازتون میپرسه که حذف کنم؟ مطمئنی؟ شما همه رو جواب بدید که حذف کن. رمز هم اگه پرسید طبیعتا بزنید.

برگردوندن زیر کلیدها

gpg --import subkey-temporary

که بعد از یه سری پرسیدن رمز - که دیگه نمینویسم، خودتون هر وقت رمز خواست بزنید - یه همچین چیزی تو خروجی میبیید :

gpg --import subkey-temporary
gpg: key 09ABEE4C: "Forud (This is an example) <[email protected]>" not changed
gpg: To migrate 'secring.gpg', with each smartcard, run: gpg --card-status
gpg: key 09ABEE4C: secret key imported
gpg: Total number processed: 5
gpg:              unchanged: 1
gpg:       secret keys read: 5
gpg:   secret keys imported: 3

گام آخر اینه که فایل subkey-temporary رو سر به نیست کنید. با هر ابزاری که دوست دارید، مثلا

shred --remove subkey-temporary 

حالا با دستور ‍gpg --list-secret-keys یه همچین چیزی میبینید :

/home/f0rud/.gnupg/pubring.kbx
------------------------------
sec#  rsa4096/09ABEE4C 2016-04-08 [SC]
uid         [ultimate] Forud (This is an example) <[email protected]>
ssb   rsa4096/E713A00C 2016-04-08 [E]
ssb   rsa4096/6D49C7B5 2016-04-08 [S] [expires: 2018-04-08]
ssb   rsa4096/12FAAB7D 2016-04-08 [S] [expires: 2018-04-08]

کلید اصلی کنارش یه علامت # هست. sec# که این نشون میده که کلید توی این کلیدها نیست! خوب تبریک میگم، موفق شدید.

حالا میتونید از کلید بدون کلید اصلی هم export بگیرید. برای اینکار کافیه که همون دستورهایی که قبلا برای اینکار زدیم رو استفاده کنید، فقط مطمئن شید که فایل اصلی که دفعه قبلی export گرفتید رو رونویسی نمیکنید و از بین نمیبرید :

gpg --export-secret-keys --armor [email protected] > no-master-private-gpg-key-fzeo-rubi-gd.private

جمع بندی نهایی

الان تعداد فایلهایی که دارید ۴ تاست. یک کلید عمومی، یک کلید خصوصی با کلید اصلی، یک کلید خصوصی بدون کلید اصلی و یک گواهی برای revoke

کلید عمومی که تکلیفش معلومه. گواهی هم که گفتم اگه منم که پرینت مکنم و اصلا به فایلش اعتماد نمیکنم.

کلید خصوصی با کلید اصلی هم تو یه سیستم امن نگه میدارم، و روی لپتاپ خودم هم کلید خصوصی بدون کلید اصلی رو هم ‍‍import میکنم و فایلش رو هم سر به نیست میکنم.

برای import کلید اینطوری عمل کنید :

gpg --import /parth/to/public-key.public /path/to/private-key.private 

و البته بعد از زدن رمز، مجددا فایل تو سیستم شما وارد میشه.

از این به بعد یه سری ترفند برای استفاده از این کلیدهاست. دیگه کار اجباری ای نیست خوندنشون

انتشار کلید

برای اینکار، همونطور که قبلا گفتم میتونید کلید رو به هر روشی که دوست دارید به دست دیگران برسونید. ولی بهترین روش، انتشارش توی keyserver‍ هاست. من شخصا تو سرور mit منتشر میکنم. منتها سرور ubuntu‍ هم هست اصولا فرق خاصی نداره، همشون با هم سینک میشن. ابزار تو لینوکس براش زیاده ولی خط فرمانیش :

gpg --send-keys KEY_ID --keyserver hkp://subkeys.pgp.net

KEY_ID هم میتونید با زدن gpg --list-keys ببینید. راه دوم هم اینه که فقط برید به آدرس http://pgp.mit.edu/ و توی باکسی که هست، کل اون فایل کلید عمومی رو کپی کنید و تموم :)

امضای کامیت ها و تگها

گفتم که برای امضای کامیتهام از این روش استفاده میکنم. برای اینکار git نسخه ۱.۷ به بالا احتیاج دارید که اگه ندارید واقعا توصیه میکنم سیستمتون رو آپدیت کنید :))) همین چند روز پیش، گیتهاب قابلیت تعیین اعتبار رو به سیستمش اضافه کرد، و اصلا انگیزه من از نوشتن این مطلب، همون بود و البته نباید نقش @meysampg رو نادیده گرفت :)))

git commit verify- github

برای اینکار سوییچ S توسط گیت معرفی شده :

 -S[<keyid>], --gpg-sign[=<keyid>]
           GPG-sign commits. The keyid argument is optional and defaults to the committer identity; if specified, it must be stuck to the option without a space.

راحت ترین حالت اینه که کلید gpg شما با هویت شما توی گیت یکی باشه. یعنی اون زمانی که دارید کلید gpg رو میسازید، اسم و ایمیلی رو بدید که برای گیت کانفیگ کردید و توی فایل کانفیگ گلوبال گیت هست . برای دیدن هویت خودتون توی گیت اینو بزنید :

git config --global --get "user.name"
git config --global --get "user.email"

اولی باید همون چیزی باشه که به عنوان Real name وقت ساختن کلید اضافه کردید، و دومی هم ایمیل ثبت شدست. اگر فرق میکنه، میتونید یه UID دیگه اضافه کنید یا اینکه وقت کامیت به -S شناسه کلید رو هم اضافه کنید که مثلا من چند خط بالاتر کلیدم رو با list-keys نشون دادم :

ssb   rsa4096/12FAAB7D 2016-04-08 [S] [expires: 2018-04-08]

میشه 12FAAB7D

یه نکته هم آرش تو کامنتها گفت. ظاهرا تو نسخه ۲ به بعد میشه به صورت کلی رو یه رپو، تنظیم کرد که گیت کل کامیتها رو امضا کنه :

git config commit.gpgsign true

و حتی میشه تنظیمات کلی گیت رو دستکاری کرد و پیش فرض سیستم رو تغییر داد :

git config --global commit.gpgsign true

افزودن یک ایمیل به کلید

گاهی لازم میشه که یک ایمیل دیگه اضافه کنید. مثل حالتی که بالا گفتم. فرض کنید از ایمیل شرکتی برای کامیت استفاده میکنید و میخواید کامیت رو ساین کنید. یک راه اینه که شناسه کلید رو بزنید، اما راه دوم اینه که ایمیل رو به کلید اضافه کنید . برای اینکار نمیشه از کلید بدون کلید اصلی استفاده کرد. (یکی از دلایلی که اون همه دردسر کشیدیم همین بود :) ) برید روی سیستمی که به کلید اصلی دسترسی دارید و دستور ویرایش رو بزنید :

اول adduid رو بزنید و یه ایمیل جدید اضافه کنید. بعدش این ایمیل انتخاب شدست، شما کافیه addkey رو بزنید تا یک کلید به این هویت اضافه بشه، درنهایت save و تمام.

حذف یک کلید

برای اینکه یه کلید رو حذف کنید به هر دلیلی، کافیه کلید اصلی رو ویرایش کنید (کلید بدون کلید اصلی نمیتونه همچین کاری کنه) :

تو این یکی، من یه سری متن هم با کلید # زدم که کامنت هستن، ممکنه یه کم گیج کننده باشه ولی لازم بود. با زدن key 1 کلید شماره یک انتخاب میشه و با دوباره زدنش کلید از حالت انتخاب خارج میشه. میتونید چند تا کلید رو انتخاب کنید و درنهایت کلیدهای انتخاب شده رو با revkey غیرفعال کنید و بعدش هم ذخیره کنید و تمام.

وقتی که کلید منقضی شد چی؟

یه نکته‌ای که امروز متوجهش شدم (یکی دو ماهی بعد نوشتن اصل متن) اینه که خوب، زیر کلید یه جایی منقضی میشه. مثلا بعد یک سال. خوب بعد چی؟ یه کلید دیگه بسازیم؟ درستش اینه که نه. زیر کلید قبلی، از اون تاریخ به بعد اعتبار نداره. همه امضاهاش بی اعتبار میشن، مثلا کامیتهای ساین شده گیت با رنگ قرمز نشون داده میشن، البته اگه کلید گم شده باشن، این کمترین نگرانی شماست :) ولی اگر کلیدها رو دارید، بهترین کارش اینه که کلید رو تمدید کنید. اگر دسترسی نداشتید که خوب هیچ، در غیر اینصورت بهتره مجددا کلید اصلی رو تو یه کامپیوتر امن، import کنید و بعدش بزنید gpg --edit-key [email protected] گام بعدی انتخاب کلیده. با دستور key n کلید رو انتخاب کنید n میشه شماره کلید توی لیست. ایندکسها از صفر شروع میشن. بعد از اینکار، کنار کلید یه علامت ستاره میاد.اونوقت میتونید با دستورات مختلف با این کلید (که حالا انتخاب شده) کار کنید و بعد با expire تاریخ انقضای کلید رو میشه تغییر داد.

– یه کم تو ترمینال مشکل داشتم وقت رکورد این، رمز هم دو دفعه اشتباه زدم :/ یادم هم رفت آخرش save رو بزنم، به جاش ctrl+d‍‍ رو زدم که میپرسه میخوای ذخیره کنی یا نه، نتیجه آخرش یکیه.

افزودن عکس به کلید

اینکه اینکار درسته یا نه، به اعتقادات خودتون برمیگرده. من بدم نمیاد، بعضی ها ممکنه دوست نداشته باشن :) چند تا نکته، اول اینکه عکس کم حجم باشه. چون به کلید عمومی اضافه میشه و حجم کلید عمومی بهتره پایین بمونه جون مدام درحال دست به دست شدنه. دوم اینکه فایل باید jpg باشه. تا جایی که میدونم این فقط تو استاندارد اومده نه png یا هر پسوند دیگه ای.

خیلی سادست، بازهم کلید gpg رو با --edit-key باز کنید و اینبار دستور addphoto رو بزنید.

دقت کنید که به عکس ۱۱ کیلوبایتی من میگه خیلی بزرگ، که البته حق داره، سبیلهام توی اون عکس خودشون ۱۰-۱۱ کیلویی هستن.

— دیگه خسته شدم :) این مطلب رو هر موقع حسش باشه آپدیت میکنم و مطالب مرتبط رو اضافه میکنم. شما هم اگه دوست دارید اصلاحیه بزنید یا هر چی اضافه کنید، گیتهاب و پول ریکوئست شما را میخواند :) —

comments powered by Disqus