صحنهٔ آموزشی TLS؛ کارشناسی با لپ‌تاپ در کنار تختهٔ توضیح زنجیرهٔ گواهی و SNI.

WIUNIX ACADEMY

عیب‌یابی TLS؛ زنجیرهٔ گواهی، SNI و تفاوت کلاینت‌ها

اگر مرورگر وصل می‌شود اما اپلیکیشن خطای گواهی می‌دهد، نام دامنه، گواهی ارائه‌شده، گواهی میانی و ریشه‌های مورد اعتماد را جدا بررسی کنید.

پیشرفته35 دقیقه مطالعهبه‌روزرسانی
محیطت را انتخاب کن

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Debian 12بررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من4 مقدار قابل‌تغییر

از اینجا شروع کن

در پایان چه چیزی خواهی داشت؟

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

سیستم‌عامل‌ها و نسخه‌های پوشش‌داده‌شده

مسیرهای این آموزش با مستندات رسمی ابزار و توزیع انتخابی بررسی شده‌اند. فرمان‌های آموزشی روی سرویس شما اجرا نشده‌اند؛ نتیجهٔ محیط خودتان را در هر گام بررسی کنید.

قبل از شروع

  • دسترسی مجاز برای بررسی یک مقصد HTTPS و دانستن نام دامنه، IP و پورت واقعی آن.
  • OpenSSL 3، curl و ابزار timeout روی کلاینت لینوکس موجودند؛ مجموعهٔ گواهی‌های مورد اعتماد سیستم به‌روز است.
  • مثال‌ها برای HTTPS معمولی با احراز هویت سرورند؛ mTLS، STARTTLS و دورزدن pinning در محدودهٔ این راهنما نیستند.

برقراری ارتباط به معنی تأیید هویت سرور نیست

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

فقط مقصدی را بررسی کنید که مجاز به بررسی آن هستید. IP نمونه را با مقصد واقعی عوض کنید. نتیجهٔ یک مرورگر را به همهٔ اپلیکیشن‌ها تعمیم ندهید؛ مجموعهٔ ریشه‌ها و قواعد اعتبارسنجی آن‌ها ممکن است متفاوت باشد.

01

قدم بعدی

پیش از شروع، ابزار و تفاوت‌های توزیع را بررسی کنید

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

در Debian 13 و 12 نام بسته‌ها در پنل آمده است. Debian 12 در دورهٔ LTS قرار دارد و پوشش پشتیبانی به معماری و بسته بستگی دارد؛ صرف نصب‌بودن یک بسته تضمین پشتیبانی آن نیست.

فایل CA انتخابی، ریشه‌های اعتماد توزیع را در آزمون‌های آنلاین مشخص می‌کند. در Debian و Ubuntu مسیر معمول bundle زیر /etc/ssl است؛ در خانوادهٔ Red Hat از bundle زیر /etc/pki استفاده می‌شود. مسیر انتخاب‌شده را در پنل تنظیمات می‌بینید. برای بررسی اختلاف اعتماد، backend واقعی curl و تنظیم اعتماد برنامهٔ مشکل‌دار را هم ثبت کنید؛ Java یا کانتینر ممکن است مخزن دیگری داشته باشد.

bash

ترمینال میزبان مجاز معرفی‌شده در همین بخش

cat /etc/os-release
dpkg-query -W openssl curl ca-certificates coreutils
command -v openssl curl timeout
stat -c '%A %U %G %n' '/etc/ssl/certs/ca-certificates.crt'
از کجا بدانم درست انجام شد؟

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

02

قدم بعدی

نسخه و ساعت همان کلاینت مشکل‌دار را ثبت کنید

بررسی را از کلاینتی شروع کنید که خطا می‌دهد. نسخهٔ OpenSSL، بک‌اند TLS در curl و زمان UTC آن را ثبت کنید. مرورگر، curl و اپلیکیشن ممکن است از مجموعهٔ اعتماد یکسانی استفاده نکنند.

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

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

date -u +'%Y-%m-%dT%H:%M:%SZ'
openssl version -a
curl --version
از کجا بدانم درست انجام شد؟

نسخهٔ ابزارها، بک‌اند TLS، زمان کلاینت و فایل اعتماد انتخابی مشخص‌اند.

03

قدم بعدی

بررسی نام و زنجیره را واقعاً اجباری کنید

اتصال را به IP مشخص بفرستید، ولی app.example.com را هم به‌عنوان SNI و هم نام مورد انتظار معرفی کنید. گزینهٔ verify_return_error مهم است: s_client بدون آن ممکن است پس از خطای اعتبارسنجی هم ادامه دهد.

چاپ‌شدن گواهی یا عبارت اتصال موفق کافی نیست. نتیجهٔ verification و کد خروج را بخوانید. timeout بیرونی فقط مدت این بررسی را محدود می‌کند.

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

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

timeout 15 openssl s_client -connect '203.0.113.10:443' -servername 'app.example.com' -verify_hostname 'app.example.com' -CAfile '/etc/ssl/certs/ca-certificates.crt' -verify_return_error -brief </dev/null
printf 's_client exit=%s\n' "$?"
از کجا بدانم درست انجام شد؟

نام و زنجیره تأیید شده‌اند یا خطای روشنِ نام، زمان یا اعتماد دریافت کرده‌اید. کد۱۲۴ یعنی مهلت ابزار بیرونی تمام شده است.

04

قدم بعدی

فقط مسیر انتخاب IP را تغییر دهید

این درخواست DNS را فقط برای یک مقصد کنار می‌زند، اما نام HTTPS، هدر Host و SNI را حفظ می‌کند. از همان پورت در resolve و نشانی استفاده کنید؛ نیازی به تغییر hosts یا خاموش‌کردن verification نیست.

پاسخ401 یا403 نشان می‌دهد به HTTP رسیده‌اید، نه اینکه ورود به برنامه مجاز شده است. اگر نتیجه با OpenSSL فرق دارد، مجموعهٔ اعتماد و بک‌اند TLS هر دو ابزار را مقایسه کنید.

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

curl --cacert '/etc/ssl/certs/ca-certificates.crt' --noproxy '*' --resolve 'app.example.com:443:203.0.113.10' --connect-timeout 3 --max-time 15 -sS -o /dev/null -w 'HTTP %{http_code} TLSverify=%{ssl_verify_result}\n' 'https://app.example.com:443/'
از کجا بدانم درست انجام شد؟

پاسخ HTTPS با اعتبارسنجی فعال دریافت شده یا اختلاف مشخص کلاینت‌ها ثبت شده است.

05

قدم بعدی

ببینید سرور چه گواهی‌هایی می‌فرستد

پنل بعد فهرست گواهی‌های عمومی ارسال‌شده در handshake را نشان می‌دهد؛ این فهرست لزوماً یک زنجیرهٔ تأییدشده نیست. معمولاً سرور باید leaf و گواهی‌های میانی لازم را بفرستد؛ ریشهٔ قابل اعتماد در کلاینت قرار دارد و معمولاً ارسال آن لازم نیست.

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

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

timeout 15 openssl s_client -connect '203.0.113.10:443' -servername 'app.example.com' -showcerts </dev/null
از کجا بدانم درست انجام شد؟

گواهی سرور و صادرکننده‌های ارسال‌شده مشخص‌اند؛ کمبود گواهی میانی را از نبود اعتماد به ریشه جدا کرده‌اید.

همهٔ آموزش‌های آکادمی ↗