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

گواهی، انبار اعتماد نیست

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

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

گزینه ca در OpenVPN روشن‌ترین مورد اعتماد محدود به برنامه است. آن فایل لنگرهایی را نام می‌برد که کلاینت می‌پذیرد و ممکن است یک CA خصوصی یا در استقراری کوچک، خود گواهی خودامضاشده سرور را در خود داشته باشد. نسخه 2.6 نیز --peer-fingerprint را برای سنجاق کردن اثر انگشت SHA-256 به‌جای توزیع فایل CA می‌پذیرد. WireGuard دورتر هم می‌ایستد: هیچ گواهی‌ای ندارد، فقط یک کلید عمومی ایستا برای هر همتا، پس پرسش خودامضا بودن به آن نمی‌خورد.

اینکه اعتماد را کجا نصب می‌کنید تعیین می‌کند چه کسی آن را به ارث می‌برد

همان گواهی را در سه جا بگذارید و سه شعاع انفجار متفاوت می‌گیرید. بسته‌ای که فقط کلاینت VPN می‌خواند بر همان کلاینت اثر می‌گذارد. ریشه‌ای در انبار سیستم‌عامل بر هر برنامه‌ای اثر می‌گذارد که به آن انبار مراجعه می‌کند. مرورگری با پایگاه اعتماد خودش ممکن است هر دو را نادیده بگیرد، و به همین دلیل یک هشدار می‌تواند از وارد‌کردنی که موفق به نظر می‌رسید جان سالم به در ببرد.

در Debian یا Ubuntu، انداختن یک فایل در /usr/local/share/ca-certificates/ و اجرای update-ca-certificates بستهٔ سراسری سیستم را تغییر می‌دهد. در Windows، certutil -addstore -f Root در انبار ماشین می‌نویسد و به اعلان دسترسی بالا نیاز دارد، در حالی که افزودن -user به‌جای آن انبار کاربر جاری را هدف می‌گیرد؛ این دو قابل تعویض نیستند. Firefox پایگاه داده NSS خودش را نگه می‌دارد، پس ممکن است وارد‌کردن در سطح سیستم‌عامل هرگز آنجا ظاهر نشود.

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

شما هنوز بدون CA عمومی رمزنگاری می‌کنید

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

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

اعتماد به صادرکننده بررسی نام را دور نمی‌زند

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

OpenVPN این تفکیک را آشکار می‌کند. verify-x509-name موضوع مورد انتظار را از طریق تطبیق name، name-prefix یا subject سنجاق می‌کند. remote-cert-tls server مستلزم آن است که گواهی همتا به‌عنوان گواهی سرور قابل استفاده باشد، که گواهی فقط-کلاینت را رد می‌کند حتی وقتی صادرکننده مورد اعتماد است. هیچ‌یک از این دو تنظیم با فرستادن فایل CA جایگزین نمی‌شود.

پیش از هر تصمیمی گواهی را بررسی کنید:

  • openssl x509 -in server.crt -noout -subject -issuer -dates -ext subjectAltName نشان می‌دهد چه کسی آن را صادر کرده، برای کدام نام‌ها و تا چه زمانی.
  • openssl verify -CAfile ca.crt server.crt بررسی می‌کند که آیا زنجیره‌ای که قصد دارید بفرستید واقعاً برگه را معتبر می‌سازد.
  • openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -CAfile ca.crt -verify_return_error برای نقاط پایانی TLS مانند یک پورتال وب کار می‌کند؛ پروتکل OpenVPN روی 1194 یک جریان ساده TLS نیست، پس آن آزمون آنجا اعمال نمی‌شود.

گواهی با تاریخ منقضی، بدون subjectAltName برای نامی که به آن وصل می‌شوید، یا بدون کاربرد serverAuth شکست می‌خورد، هر قدر هم که لنگر با دقت نصب شده باشد.

پنج بررسی پیش از پذیرش یک گواهی

اثر انگشت را از کانالی مقایسه کنید که همان اتصالی نیست که می‌خواهید تعمیر کنید: یک کنسول، یک نصب‌کننده که از قبل دارید، یک فایل پیکربندی امضاشده. openssl x509 -in server.crt -noout -fingerprint -sha256 روی سرور و همان مقدار در گزارش کلاینت کافی است تا بدانید به یک شیء نگاه می‌کنید.

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

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

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

مقالات مرتبط