שגיאת צופן TLS ב-OpenVPN: השוו קודם את שני הצדדים
שגיאה „אין צופן משותף“ שייכת לערוץ הבקרה של TLS, לא ל-data-ciphers. השוו קודם גרסאות, אחר כך רשימות חבילות, ואז הוכיחו את המשא ומתן.
שגיאה „אין צופן משותף“ נשמעת כמו הגדרה אחת שצריך לשנות, וההגדרה שרוב האנשים משנים היא דווקא השגויה. OpenVPN מחזיק מדיניות נפרדת לערוץ הבקרה שמבצע את לחיצת היד של TLS ולערוץ הנתונים שנושא מנות בתוך המנהרה, והשגיאה מציינת את הראשון בזמן שאנשים עורכים את השני. השוואה של מה שכל צד מתיר, בסדר הנכון, הופכת את הניחושים לשני החלטות או שלוש: גרסה, אחר כך רשימת חבילות, אחר כך פרטי התחברות.
אם הסדר הזה שגוי, אפשר לבזבז שעה בהוספת שם AES לרשימה שמעולם לא נבדקה.
שתי רשימות צפנים, ורק אחת מהן שוברת את לחיצת היד
ערוץ הבקרה מנהל משא ומתן על הפעלת TLS, והמדיניות שלו נכתבת עם tls-cipher עבור TLS 1.2 ו-tls-ciphersuites עבור TLS 1.3. ערוץ הנתונים מוגדר בנפרד עם data-ciphers, שם אי-התאמה יוצרת חיבור שנקשר ואז אינו מצליח להעביר תעבורה. שניהם מייצרים שגיאות שמזכירות צפנים, ולכן מבלבלים ביניהם. לחיצת יד שלעולם אינה מושלמת מצביעה על ערוץ הבקרה, ואילו מנהרה שנקשרה ומאבדת מנות מצביעה על ערוץ הנתונים.
קראו את ההודעה כולה ולא את השורה הראשונה. אי-התאמת גרסאות, חבילה חסרה, אלגוריתם חתימת תעודה שהצד האחר דוחה, וכשל באימות שם המארח — כולם מסתיימים בשגיאת TLS, ורק אחד מהם נוגע ברשימת החבילות שלכם. הפרדה בין הקטגוריות האלה היא רוב האבחון.
השוו גרסאות לפני שאתם משווים חבילות
צד שמוגבל ל-TLS 1.2 וצד שדורש 1.3 אינם חולקים שום גרסה, ואף מחרוזת צופן אינה מגשרת על כך. רשמו tls-version-min ו-tls-version-max בשני הצדדים, או את ברירות המחדל של הבילדים שבשימוש, מפני שמדיניות OpenSSL של הפצה עשויה להעלות את הרף בלי שאף אפשרות של OpenVPN תאמר זאת. אם צד אחד הוא התקן או לקוח של צד שלישי, החלון שלו הוא מה שהקושחה שלו מתירה. רק כשהחלונות חופפים יש משמעות להשוואת חבילות.
הרשומות האלה צריכות גם לנקוב בשמות הקבצים הבינאריים האמיתיים. openvpn משורת פקודה במחשב הנייד שלכם אינו בהכרח הלקוח שמטפל בפרופיל מיובא.
רשימות TLS 1.2 ו-TLS 1.3 אינן מתערבבות
שמות החבילות של TLS 1.2 נראים כך: ECDHE-RSA-AES256-GCM-SHA384 והם שייכים ל-tls-cipher, שמקבל מחרוזת צופן של OpenSSL. חבילות TLS 1.3 נקראות כך: TLS_AES_256_GCM_SHA384 והן שייכות ל-tls-ciphersuites; הוספת אחת למחרוזת 1.2 אינה מגדירה את רשימת 1.3, והמנתח עשוי לקבל את הטקסט בלי להתאים אותו אי פעם. מסנן שנכון עבור גרסה אחת אינו אומר דבר על האחרת. רשמו לאיזו גרסה מיועדת כל רשימה.
openvpn --show-tls מדפיס מה הבילד המקומי תומך בו, וזהו מלאי ולא הבטחה: ייתכן שהצד המרוחק אינו מתיר את החבילות האלה, ושהפרופיל הפעיל אינו מפעיל אותן. השתמשו בו כדי לשלול בילד שאינו יכול להציע חבילה כלל, ואז השוו את הרשימות המוגדרות.
הוכיחו את המשא ומתן על חיבור חדש
לחיצת יד מוצלחת היא הראיה היחידה שנחשבת, והיא חייבת לבוא מהלקוח האמיתי עם הפרופיל האמיתי. הגבירו את רמת הפירוט של השרת, התחברו פעם אחת, וקראו מהלוג את גרסת הפרוטוקול והחבילה שנקבעו במשא ומתן במקום להניח שהערך הראשון שהוצע ניצח. אחר כך אמתו את ערוץ הנתונים בנפרד עם תעבורה דרך המנהרה, מפני שלחיצת יד שעובדת וערוץ נתונים שנכשל הם תיקונים שונים. חזרו על כך אחרי כל שינוי תצורה, מפני שפרופיל לקוח מיושן הוא שלילי-שווא נפוץ.
אם אין תצורה משותפת מאושרת, התשובה היא שדרוג או תוכנית העברה, לא מדיניות מוחלשת. tls-version-min הנמכה, ביטול האימות או הפעלת כל חבילה ישנה מסירים את הדחייה בלי לעמוד בדרישת האבטחה שיצרה אותה.
רשמו את הגרסה שנקבעה, את החבילה ואת צופן הנתונים בכרטיס השינוי. האדם הבא שייתקל בשגיאת TLS יתחיל מהרשומה הזו ולא ממחרוזת צופן שנמצאה בפוסט בפורום.