کلاینت می‌داند به یک کلید وصل شده؛ از کجا بداند آن کلید متعلق به کتابخانه است؟ گواهی، نام و کلید را با تأیید یک صادرکننده به هم پیوند می‌دهد. امشب درخواست شناسنامهٔ سرویس را می‌سازیم، بدون آنکه کلید خصوصی را برای صادرکننده بفرستیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: Ubuntu 24.04؛ OpenSSL 3؛ کاربر عادی؛ پوشهٔ جدید ~/lpic303/pki.

جایگاه در دوره: هدف‌های 331.1 آزمون 303-300.

زنجیرهٔ اعتماد چگونه کار می‌کند؟#

PKI یعنی زیرساخت کلید عمومی؛ مجموعه‌ای از کلیدها، گواهی‌ها، صادرکننده‌ها و قواعد اعتماد. CA یا مرجع صدور، گواهی را امضا می‌کند. کلاینت یک ریشهٔ مورد اعتماد دارد و باید زنجیره، تاریخ، کاربرد و نام سرویس را بررسی کند. اعتماد به CA مساوی اعتماد به هر نامی که سرور ادعا می‌کند نیست.

در X.509، شمارهٔ سریال، صادرکننده، بازهٔ اعتبار و افزونه‌ها مهم‌اند. SAN یا نام جایگزین موضوع، نام‌های مجاز سرویس را مشخص می‌کند. basicConstraints می‌گوید گواهی می‌تواند CA باشد یا نه؛ keyUsage و extendedKeyUsage کاربرد کلید و گواهی را محدود می‌کنند.

کلید سرویس و درخواست صدور#

CSR درخواست امضای گواهی است؛ کلید عمومی و اطلاعات درخواستی را دارد و با کلید خصوصی متقاضی امضا می‌شود.

umask 077
mkdir -p ~/lpic303/pki
cd ~/lpic303/pki
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 \
  -out server.key
openssl req -new -key server.key -out server.csr \
  -subj '/CN=library.example.test' \
  -addext 'subjectAltName=DNS:library.example.test'
openssl req -in server.csr -noout -verify -text
openssl pkey -in server.key -pubout -out server-public.pem

بررسی CSR باید امضای داخلی آن و SAN را نشان دهد. این هنوز گواهی صادرشده نیست. CA حق دارد افزونهٔ درخواستی را نپذیرد؛ به‌خصوص درخواست CA:TRUE نباید خودکار کپی شود. server.key بدون رمز فایل ساخته شده تا بعداً سرویس آزمایشگاهی غیرتعاملی آن را بخواند؛ مجوز محدود فایل و پوشه ضروری است.

قالب‌ها را با الگوریتم اشتباه نگیر#

PEM نمایش متنی با پوشش Base64 است؛ DER نمایش دودویی ساختار است. PKCS#12 می‌تواند کلید و گواهی‌ها را در یک بسته نگه دارد و خودش یک الگوریتم رمزنگاری نیست. برای مقایسهٔ دو نمایش کلید عمومی:

openssl pkey -pubin -in server-public.pem -outform DER -out server-public.der
openssl pkey -pubin -inform DER -in server-public.der -out restored-public.pem
cmp server-public.pem restored-public.pem

سکوت cmp یعنی بازنمایی متنی بازسازی‌شده یکسان است. نام پسوند فایل به‌تنهایی نوع محتوا را ثابت نمی‌کند؛ ابزار درست باید آن را parse کند.

تمرین و عیب‌یابی#

یک CSR دوم برای نام اشتباه بساز و SAN دو درخواست را مقایسه کن. اگر کلید با گواهی آینده جفت نباشد، سرویس معمولاً در بارگذاری TLS شکست می‌خورد؛ کلید عمومی استخراج‌شده از هر دو باید برابر باشد. کلید خصوصی را برای «بررسی» در چت، Git یا درخواست CA قرار نده.

ساخت درخواست در openssl-req و قالب‌ها در openssl-format-options توضیح داده شده‌اند.