ورود با خطای گواهی شکست می‌خورد، پس اقدام آشکار شبیه تبدیل به نظر می‌رسد. این غریزه مردم را به مسیری می‌برد که پسوند فایل عوض می‌شود و رد شدن دقیقاً همان می‌ماند. یک خط ssh-ed25519 در authorized_keys و یک گواهی کلاینت OpenVPN دو شیء اعتبارنامه‌ی جداگانه‌اند، با صادرکننده‌های متفاوت، کدگذاری‌های متفاوت و مسیرهای ابطال متفاوت. اگر این بررسی‌ها را به ترتیب انجام دهید، در یک دقیقه می‌دانید که آیا تبدیل اصلاً می‌تواند کمک کند.

واقعاً کدام شیء را در دست دارید؟

پنج چیز هست که مردم به آن کلید می‌گویند، و تنها یکی از آن‌ها همان چیزی است که یک پروفایل TLS می‌خواهد. کلید عمومی SSH یک خط متن است با پیشوند نوع و محتوای base64. گواهی OpenSSH همان کلید به‌اضافه‌ی امضا، principals و گزینه‌هاست که ssh-keygen در نقش CA کوچک خودش تولید می‌کند. گواهی X.509 ساختاری کاملاً متفاوت است: موضوع، پنجره‌ی اعتبار، افزونه‌ها و امضای یک مرجع صدور گواهی را حمل می‌کند. کلید خصوصی نیمه‌ی محرمانه است، و بسته‌ی صادرشده معمولاً گواهی به‌همراه زنجیره‌اش به‌همراه کلید خصوصی در یک فایل است.

آزمون اول یک فرمان هزینه دارد. openssl را به فایل نشانه بگیرید و بخواهید ساختار گواهی را تجزیه کند:

openssl x509 -in client.crt -noout -subject -issuer

اگر این کار با خطای بارگذاری‌نشدن یا PEM شکست بخورد، فایل هر نامی که گذاشته باشید گواهی X.509 نیست. تغییر نام، ASN.1 درون آن را بازنویسی نمی‌کند، و پیچیدن یک خط کلید عمومی در متن سرصفحه‌ی PEM هم این کار را نمی‌کند.

آیا پروفایل اصلاً گواهی می‌خواهد؟

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

پیکربندی‌های قدیمی‌تر کلید ایستا مورد سومی هستند. آن‌ها پیش از دست‌دادن TLS هستند و فایل راز از پیش مشترک را انتظار دارند، و به همین دلیل چسباندن کلید عمومی در آن فیلد هم نمی‌تواند کار کند. پیش از تصمیم‌گیری درباره‌ی نادرست‌بودن اعتبارنامه، بخوانید پروفایل واقعاً چه می‌خواهد.

بازکدگذاری چه می‌تواند بکند و چه نمی‌تواند

کلیدهای خصوصی واقعاً ظرف‌های جایگزین مشروع دارند. همان کلید RSA یا EC را می‌توان به‌صورت PEM سنتی، به‌صورت PKCS#8 یا درون بسته‌ی PKCS#12 نوشت، و ابزارها با کمال میل میان آن‌ها تبدیل می‌کنند. کلیدهای عمومی داستان مشابهی دارند: ssh-keygen می‌تواند قالب RFC 4716 یک کلید SSH را بیرون بدهد، و OpenSSH قالب گواهی خودش را هم می‌فهمد. همه‌ی این‌ها نمایش است، و نمایش اعتماد نیست.

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

این همان مرحله‌ای است که بیشتر تلاش‌ها بی‌صدا شکست می‌خورند: فایل اکنون به .crt ختم می‌شود، کلاینت آن را بی‌شکایت می‌خواند، و دست‌دادن همچنان قطع می‌شود چون همتا نمی‌تواند زنجیره‌ای تا صادرکننده‌ی مورد اعتماد بسازد.

مرجع صدور گواهی کجا وارد تصویر می‌شود

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

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

استفاده‌ی دوباره از کلید SSH چه هزینه‌ای برایتان دارد

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

پس چک‌لیست با یک شرط توقف تمام می‌شود، نه با یک ترفند. اگر openssl فایل را به‌عنوان گواهی تجزیه نکند، تبدیل را متوقف کنید و بگویید چه دارید: کلید SSH، گواهی SSH، گواهی X.509، کلید خصوصی یا بسته. اگر پروفایل گواهی کلاینت نمی‌خواهد، متوقف شوید و بپرسید سرور کدام روش احراز هویت را انتظار دارد. تنها وقتی هر دو پاسخ به X.509 اشاره کنند، ثبت مرحله‌ی بعدی می‌شود، و آن گفتگو با اسم درست در جمله‌ی اول بسیار سریع‌تر پیش می‌رود.

مقالات مرتبط