حل مشکل افزودن مخازن خارجی در اوبونتو 22.04 با gpg
۹ اسفند ۱۴۰۳
دستورات apt-key
و add-apt-repository
ابزارهایی هستند که برای مدیریت کلیدها و افزودن مخازن خارجی به سیستم APT در اوبونتو استفاده میشوند، اما این کلیدها بهصورت جهانی مورد اعتماد قرار میگیرند که ممکن است مشکلات امنیتی به همراه داشته باشد. از نسخه 20.10 اوبونتو، هشدارهایی مبنی بر منسوخ شدن این ابزارها داده شده و توصیه میشود از gpg
به جای آنها استفاده شود. gpg
بهطور مستقیم عمل میکند و بهطور کامل با نسخههای قدیمیتر اوبونتو سازگار است. در این آموزش دو روش جایگزین برای استفاده از apt-key
و add-apt-repository
را توضیح خواهیم داد:
اولین روش افزودن مخزن خارجی با استفاده از کلید عمومی از طریق gpg
بهجای استفاده از apt-key
است و روش دوم افزودن مخزن خارجی با استفاده از keyserver
و gpg
بهجای add-apt-repository
میباشد.
آنچه در این مقاله خواهید خواند:
- مرحله اول: شناسایی فرمت و اجزای کلید
- مرحله دوم: دانلود کلید و تبدیل آن به فرمت سازگار با apt
- مرحله سوم: اضافه کردن مخزن به لیست پکیجها
- مرحله چهارم: نصب بسته از مخزن خارجی
- مرحله پنجم: اضافه کردن مخزن از Keyserver
- جمع بندی
مطالب پیشنهادی: نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu

مرحله اول: شناسایی فرمت و اجزای کلید
PGP یک برنامه رمزنگاری اختصاصی است که برای امضا، رمزگذاری و رمزگشایی فایلها و دایرکتوریها استفاده میشود. این فایلها برای تأیید مخازن بهعنوان منابع معتبر در apt
کاربرد دارند. GPG جایگزین متنباز PGP است که معمولاً بهصورت keyring
استفاده میشود. این دو فرمت معمولاً برای امضا و رمزگذاری فایلها بهکار میروند.
ابزار خط فرمان gpg
برای تأیید مخازن خارجی در apt
استفاده میشود. با این حال، gpg
تنها از فایلهای GPG پشتیبانی میکند و برای استفاده از فایلهای PGP، باید آنها را به فرمت قابل قبول تبدیل کنید.
در این مرحله، مثالی از Elasticsearch
میزنیم که در آن، یک کلید PGP دریافت شده و با استفاده از دستور gpg
و سوئیچ --dearmor
به فرمت apt
تبدیل میشود. سپس، آدرس مخزن به لیست منابع بسته اضافه میشود و کلید تبدیلشده بهطور مستقیم به آن ارجاع داده میشود. در آخر، با نصب بسته Elasticsearch
، این فرایند تأیید میشود.
در ادامه، باید مشخص کنید که آیا فایل کلید دریافتی شما در فرمت PGP است یا GPG!
برای اینکار میتوانید فایل کلید را با دستور curl باز کرده و محتوای آن را ببینید:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch
Output
-----BEGIN PGP PUBLIC KEY BLOCK-----
. . .
همانطور که میبینید، باوجود اینکه در URL به GPG اشاره شده است، خط اول نشان میدهد که این فایل در واقع یک فایل PGP است. دقت کنید که apt
فقط از فرمت GPG پشتیبانی میکند.
مرحله دوم: دانلود کلید و تبدیل آن به فرمت سازگار با apt
در این مثال، برای Elasticsearch
ابتدا یک فایل PGP را دانلود کنید که باید بعد از دانلود، آن را به فرمت GPG تبدیل کنید. برای این کار، از دستور curl
برای دانلود کلید استفاده میشود و سپس خروجی دانلود شده به دستور gpg
منتقل میشود. با استفاده از پارامتر --dearmor
، فایل PGP به فرمت GPG تبدیل میشود تا بتوانید آن را در سیستم خود بهطور مناسب استفاده کنید.
در اوبونتو، مسیر /usr/share/keyrings
جایی برای ذخیره فایلهای GPG در نظر گرفته شده است، زیرا این مسیر پیشفرض برای ذخیره keyringها است. در این مثال، نام فایل elastic-7.x.gpg
است:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg
دقت کنید که این دستور فایل PGP را به فرمت درست GPG تبدیل کرده و آماده لیست شدن در منابع apt
میشود.
مرحله سوم: اضافه کردن مخزن به لیست پکیجها
در این مرحله، پس از دانلود و تبدیل کلید به فرمت GPG، میتوانید مخزن را به منابع پکیجهای apt
در اوبونتو اضافه کنید. apt
پکیجها را از سه منبع اصلی دریافت میکند: فایل اصلی sources.list
، فایلهای .list
موجود در دایرکتوری sources.list.d
، و فایلهای .source
در همان دایرکتوری.
حالت اول: افزودن مستقیم به فایل sources.list
در این روش، میتوانید مخزن را مستقیماً به فایل اصلی sources.list
اضافه کنید. این فایل در مسیر /etc/apt/sources.list
قرار دارد و محل اصلی برای مدیریت منابع پکیجها است. پس از افزودن آدرس مخزن و کلید GPG، apt
از این فایل برای دسترسی به منابع پکیجها استفاده میکند.
حالا برای ویرایش فایل /etc/apt/sources.list
، میتوانید از ویرایشگر متنیnano
استفاده کنید. برای باز کردن فایل با nano
، دستور زیر را در ترمینال وارد کنید:
sudo nano /etc/apt/sources.list
بعد از اضافه کردن مخزن زیر، فایل را ذخیره کرده و ویرایشگر را ببندید.
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main
خط بالا شامل موارد زیر در مورد مخزن است:
deb
:مخزن از معماری Debian معمولی استفاده میکند.arch=amd64,arm64
: این گزینه معماریهایی را که دادههای APT برای آنها دانلود میشود، مشخص میکند. مانند amd64 و arm64.signed-by=/usr/share/keyrings/elastic-7.x.gpg
: این قسمت مشخص میکند که برای تأییدمخزن از کدام کلید استفاده شود. در اینجا، به فایل.gpg
در مسیر/usr/share/keyrings/
اشاره میکند. این تغییر، کلید را به مخزن خاصی مرتبط میکند و نقص امنیتیapt-key
را رفع میکند.https://artifacts.elastic.co/packages/7.x/apt stable main
: این URI محل دقیق دادههای موجود در مخزن را نشان میدهد./etc/apt/sources.list.d/elastic-7.x.list
: این آدرس، محل و نام فایل جدیدی است که باید ایجاد شود./dev/null
: این مورد زمانی استفاده میشود که خروجی یک دستور ضروری نباشد. اشاره کردن به این مسیر خروجی را حذف میکند.
در نهایت، برای ذخیره تغییرات و خروج از ویرایشگر، از دستور CTRL+O
برای ذخیره و CTRL+X
برای خروج استفاده کنید.
پیشنهاد مطالعه: آشنایی با خط فرمان لینوکس
حالت دوم: ایجاد یک فایل جدید .list
در sources.list.d
در این روش، به جای ویرایش مستقیم sources.list
، یک فایل جداگانه در sources.list.d
ایجاد میشود. این کار باعث میشود مدیریت مخازن راحتتر باشد و در صورت نیاز، بتوانید مخزن موردنظرخود را بدون تغییر در فایل اصلی حذف یا ویرایش کنید.
حالا برای اینکار کافی است دستور echo
را به کمک tee
اجرا کنید تا فایل جدیدی ایجاد شود، سپس خط مربوط به مخزن را در آن ذخیره کنید. در مثال زیر، نام فایل elastic-7.x.list
میباشد:
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null
این دستور کار ایجاد دستی فایل و اضافه کردن مخزن را خیلی سریعتر و سادهتر انجام میدهد.
حالت سوم: ایجاد یک فایل .sources
در sources.list.d
در روش آخر بجای اینکه از فایلهای .list
استفاده کنیم، فایلهای .sources
را برای اضافه کردن مخازن انتخاب میکنیم. فایلهای .sources
از فرمت deb822
استفاده میکنند که نسبت به فرمت معمولی deb
شفافتر است. با اینحال از لحاظ عملکرد، تفاوتی بین این دو فرمت وجود ندارد. در ادامه، برای ایجاد یک فایل .sources
دستور زیر را وارد کنید:
sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
پس از ایجاد فایل، مخزن خارجی را با فرمت خاص deb822
اضافه کنید:
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main
در آخر بعد از وارد کردن متن بالا، فایل را ذخیره کرده و از ویرایشگر خارج شوید.
حالا که مخازن را تنظیم کردهاید، یک نصب آزمایشی انجام دهید تا مطمئن شوید که مخازن به درستی اضافه شدهاند.
مرحله چهارم: نصب بسته از مخزن خارجی
برای اینکه apt
مخازن جدید شما را بررسی کند، دستور apt update
را اجرا کنید. اگر بدون اجرای این دستور، دستور apt install
را بزنید، ممکن است نصب بسته با خطا مواجه شود یا بستهی قدیمی از مخازن پیشفرض نصب شود.
بنابراین برای بروزرسانی مخازن این دستور را بزنید:
sudo apt update
سپس بسته موردنظرتان را نصب کنید:
sudo apt install elasticsearch
بعد از اجرای این دستورات، نصب بسته بهطور کامل انجام شده و آماده استفاده خواهد بود.
مرحله پنجم: اضافه کردن مخزن از Keyserver
add-apt-repository
و apt-key
هر دو ابزارهایی برای اضافه کردن مخازن و کلیدهای امنیتی در سیستمهای مبتنی بر دبیبان هستند. add-apt-repository نسخهای است که از keyserver
برای دانلود کلیدهای عمومی استفاده میکند، در حالی که apt-key
برای اضافه کردن کلیدهای امنیتی به مخازن سیستم طراحی شده بود. این دو ابزار در حال منسوخ شدن هستند و بهزودی دیگر بهطور رسمی پشتیبانی نمیشوند.
در این روش جدید، بهجای اینکه مستقیماً یک کلید و مخزن را وارد کنید، شما یک آدرس keyserver
(سرور کلید) و شناسه کلید دریافت میکنید. در این سناریو، شما میتوانید کلید موردنظر را مستقیماً از سرور کلید دانلود کنید و آن را در فرمت .gpg
مناسب ذخیره کنید. این یعنی نیازی به تبدیل فرمت یا اضافه کردن دستی کلید به یک keyring
موجود نخواهید داشت.
برای اضافه کردن مخزن خارجی، ابتدا باید با دستور gpg
کلید را مستقیما از keyserver
دانلود کنید، البته بسته به حجم ترافیک دانلود، این دستور ممکن است کمی زمان ببرد.
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
دستور بالا شامل برخی فلگها است که تفاوتهایی با استفاده از gpg
با یک کلید عمومی دارند:
--no-default-keyring
همراه با--keyring
: این ترکیب به شما اجازه میدهد که کلید را به یک فایل جدید خروجی بدهید، به جای اینکه آن را درkeyring
موجود وارد کنید. این برخلاف رفتار پیشفرضgpg
است که معمولاً کلید را بهkeyring
موجود اضافه میکند.--keyserver
همراه با--recv-keys
: این ترکیب مشخص میکند که از کدام سرور کلید و کدام کلید را دانلود میکنید. شما باید آدرس سرور و شناسه کلید را وارد کنید تاgpg
بتواند کلید مربوطه را از سرور دریافت کند.--homedir
: این فلگ برای تغییر مکان پیشفرضgpg
در ساخت فایلهای موقت استفاده میشود. بهطور پیشفرض،gpg
سعی میکند این فایلها را در دایرکتوری/root
بسازد، که ممکن است خطای دسترسی به علت مشکلات مجوزها ایجاد کند. با استفاده از--homedir
، فایلهای موقت در مسیر مناسب مانند/tmp
ذخیره میشوند تا از بروز مشکلات جلوگیری شود.
با استفاده از این فلگها میتوانید کلید را بهطور ایمن و درست از سرور کلید دریافت کرده و آن را به فایلهای مورد نظر خود ذخیره کنید.
بعد از دانلود کلید، باید مخزن را به یک فایل .list
اضافه کنید. این کار دقیقا شبیه روش اضافه کردن مخزن خارجی با استفاده از کلید عمومی است که در مراحل بالا مشاهده کردید.
برای اینکار دستور زیر را وارد کنید:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null
در ادامه مخازن را بروزسانی کنید:
sudo apt update
در آخر بسته موردنظر خود را نصب کنید:
sudo apt install r-base
جمع بندی
تبریک! شما با موفقیت، مخازن خارجی را روی اوبونتو نصب کردید. حالا برای اینکه مطمئن شوید مخازن نصب شدهاند، یک نصب آزمایشی انجام دهید، کافیست دستور apt update
را وارد کرده و سپس بسته مورد نظر خود را apt install
نصب کنید.
سوالات متداول
1- چه تفاوتی بین استفاده از کلید عمومی و استفاده از سرور کلید (keyserver) برای افزودن مخازن وجود دارد؟
در استفاده از کلید عمومی، کلید بهطور مستقیم از یک فایل یا URL دانلود میشود و به keyring سیستم اضافه میشود. در حالی که در استفاده از سرور کلید، کلید از یک سرور کلید از راه دور دانلود شده و به keyring سیستم اضافه میشود. سرور کلید معمولاً از شناسه کلید و آدرس سرور استفاده میکند.
2- چرا باید از دستور --no-default-keyring
در هنگام دانلود کلید با gpg
استفاده کنیم؟
دستور --no-default-keyring
به gpg
میگوید که از keyring پیشفرض استفاده نکند و بهجای آن، یک keyring خاص که مسیر آن تعیین شده است، برای ذخیره کلید جدید استفاده کند. این کار کمک میکند تا از تغییرات غیرمجاز در keyring پیشفرض جلوگیری شود.
3-چرا هنگام افزودن مخازن با gpg باید از دستور --signed-by
استفاده کنیم؟
دستور --signed-by
به gpg
میگوید که برای تأیید مخزن از کدام کلید استفاده شود. این کلید بهطور خاص برای تایید امضای مخزن استفاده میشود و به apt
کمک میکند تا از صحت مخزن مطمئن شود.
4-چگونه میتوانم مخازن خارجی را پس از اضافه کردن، حذف یا ویرایش کنم؟
برای حذف یا ویرایش یک مخزن خارجی، به راحتی میتوانید فایل .list
یا .sources
مربوطه را در دایرکتوری /etc/apt/sources.list.d/
ویرایش یا حذف کنید. برای ویرایش از یک ویرایشگر متن مثل nano
یا vim
استفاده کنید.
5-آیا میتوانم از کلیدهای متفاوت برای مخازن مختلف استفاده کنم؟
بله، شما میتوانید برای هر مخزن یک کلید جداگانه استفاده کنید. در این حالت، باید از دستور --signed-by
برای مشخص کردن کلید مرتبط با هر مخزن استفاده کنید تا apt بتواند هر مخزن را با کلید خاص خود تأیید کند.