קריאת השדות הציבוריים של תעודה אינה מחייבת לעולם הצגה של המפתח הפרטי המתאים לה, והכלים לכך מגיעים עם כל מערכת שמסיימת VPN. הסיכון נמצא צעד אחד מוקדם יותר: ייתכן שהקובץ שנמסר לך אינו תעודה כלל. תעודת PEM, בלוב DER, חבילת PKCS#12 ופרופיל OpenVPN יכולים להגיע באותו שם ולהכיל חומר שונה מאוד, לכן זהה את המכולה לפני שתבחר פקודה.

שלוש עובדות קובעות איזו פקודה בטוחה: מה הקובץ מכיל, מה עליך לקרוא ממנו, ומי יראה את הפלט. טעה באחת מהן והבדיקה עצמה הופכת לתקרית.

איזה משלושת הקבצים נמסר לך

תעודת PEM היא טקסט עם סמני BEGIN ו-END גלויים, קובץ DER הוא בינארי שדורש דגל פורמט קלט, וחבילה היא מכולה שעשויה להחזיק מפתח לצד התעודה. file server.crt מפריד בין טקסט לבינארי בשנייה, ומבט בשורה הראשונה מפריד בין תעודה חשופה לפרופיל שתעודה מוטמעת בו. ניחוש כאן הוא מה שהופך בדיקה לתקרית.

אם הקובץ הוא פרופיל ולא תעודה, התייחס אליו כאל סוד עד שיוכח אחרת. ההנחה הזו לא עולה דבר, והיא מונעת את הטעות הנפוצה ביותר בכל המשימה הזו.

קריאת השדות הציבוריים של תעודת PEM

עבור תעודה שאתה מורשה לבדוק, תת-הפקודה x509 עם -noout מדפיסה את השדות שתבחר ושום דבר אחר. דיכוי הגוף הוא מה שמשאיר את הפלט במטא-נתונים, וזה גם מה שהופך אותו לבטוח להדבקה בכרטיס. הבוררים שלהלן הם הציבוריים, ותיעוד openssl x509 מפרט את השאר.

openssl x509 -in server.crt -noout -subject -issuer -dates -fingerprint -sha256

על תעודת בדיקה שנוצרה מקומית הפקודה הזו מדפיסה שורת subject ושורת issuer, את צמד notBefore ו-notAfter, וטביעת אצבע SHA-256 אחת. השדות האלה מזהים את האובייקט; הם אינם קובעים מסלול אמון תקף, שזו משימת אימות נפרדת עם פקודה משל עצמה ותשובה משל עצמה. קובץ שרשרת עשוי גם להדפיס רק את התעודה הראשונה אלא אם תעבור על הקובץ בעצמך. השוואת שני קבצים בדרך זו עולה פקודה אחת ומכריעה איזה מהם הצד השני מציג באמת.

חבילות שמחזיקות מפתח לצד התעודה

קובץ .p12 או .pfx יכול לשאת מפתח פרטי, ופקודת הניתוח מדפיסה אותו אלא אם תדכא את החלק הזה של הפלט. עם -nokeys אותה פקודה עדיין מדווחת על מבנה המכולה, כולל שקית מפתח עטופה, בלי להוציא חומר מפתח כלשהו; הסר את הדגל ותופיע בלוק מפתח בטרמינל שלך ובהיסטוריית ה-shell.

openssl pkcs12 -in bundle.p12 -nokeys -info -passin env:P12PASS

פרופיל OpenVPN מטמיע את אותו חומר כטקסט, כך שהגבול גלוי אם יודעים היכן להסתכל. חומר ציבורי יושב בין BEGIN CERTIFICATE ל-END CERTIFICATE, ואילו כל מה שבין BEGIN PRIVATE KEY לשורת ה-END המתאימה הוא המפתח ואסור לו לצאת מהמארח. העתקה של הפרופיל בשלמותו מפרסמת את שניהם.

קבלת ערך הייחוס ממקום אחר

טביעת אצבע שנקראה מהחיבור שאתה מנסה לאמת אינה מוכיחה דבר, כי הצד שאינך סומך עליו סיפק אותה. זו אינה טענה נגד טביעות אצבע; זו טענה על מקור. השווה את הערך לזה שהושג בערוץ שהצד השני אינו יכול לכתוב בו, כמו התעודה שמפורסמת במאגר פנימי או ה-hash שמודפס ברשומת שינוי חתומה.

היכן שמאגר אמון מבצע אימות, תן לו לעשות זאת, וקרא את השגיאה שהוא מייצר במקום להחליף אותה בהשוואה משלך. ההבחנה החשובה היא מי סיפק את ערך הייחוס, ולא באיזו פונקציית hash נעשה שימוש.

שיתוף התוצאה, ומה לעשות אחרי החלקה

שלח את שגיאת האימות המדויקת, את התאריכים הרלוונטיים ורק את פרטי הזהות שהנמען צריך. שמות מארח פנימיים ומזהי חשבון נשארים רגישים גם כשאין מפתח, ושירות הדבקה ציבורי הוא היעד הלא נכון לכל אחד מהם. הדבק בכרטיס, לא במאגר זמני שמישהו אחר משתף.

אם חומר מפתח אכן הופיע על המסך או בקובץ, התייחס אליו כאל חשוף וסובב אותו במקום לקוות שאיש לא הסתכל. אחר כך רשום את הקובץ שנבדק, את הפקודה שהופעלה ואת יעד הפלט, כי הרשומה הזו היא מה שהופך בהלה לנוהל. סבב עולה מעט לעומת המחיר של להניח שאיש לא שמר צילום מסך, ואותה רשומה אומרת למהנדס הבא אילו קבצים נגעו בהם בכלל. עשה את שניהם לפני שהכרטיס נסגר.

מאמרים קשורים