AES-256-GCM לא נמצא: יכולת הלקוח או המשא ומתן?
שתי שגיאות OpenVPN נראות דומות: גרסה בלי האלגוריתם ועמיתים בלי צופן משותף. קראו --show-ciphers ו-data-ciphers לפני עריכת הפרופיל.
פרופיל OpenVPN שעובד במקום אחר מדווח ש-AES-256-GCM לא נמצא, או שלעמיתים אין צופן משותף, והדחף הראשון הוא לערוך את הפרופיל. שתי ההודעות מתארות כשלים שונים. האחת אומרת שלתוכנית המקומית אין אלגוריתם כזה; האחרת אומרת שלשני הצדדים יש אלגוריתמים אבל אין בחירה משותפת. עריכת הפרופיל לא מתקנת אף אחת מהן עד שתדעו איזו יש לכם.
קראו את טקסט השגיאה המדויק ואת התוכנית שהפיקה אותו.
קבעו איזו שגיאה יש לכם
ההודעה על צופן שלא נמצא מגיעה מניתוח האפשרויות במחשב המקומי, לפני שנשלח כל מנה. משמעותה שהקובץ ההרצה שלפניכם, או הספרייה שאליה הוא מקושר, אינו מציע את האלגוריתם הזה. ההודעה על היעדר צופן משותף מגיעה מאוחר יותר, בזמן המשא ומתן, ומשמעה ששני הצדדים תומכים בצפנים אבל אינם מצליחים להסכים על אחד.
ההבחנה חשובה מפני שאחד הוא בעיית גרסת תוכנה והאחר בעיית תצורה. את הראשון פותר מספר גרסה. את השני פותר השוואה של שתי רשימות.
פער יכולת מקומי
גרסאות קהילתיות ישנות קודמות לברירות המחדל המודרניות, ויישום שולחני עשוי להביא מנוע משלו השונה מחבילת שורת הפקודה המותקנת לצידו. הריצו את הבדיקות על הקובץ ההרצה שהפעיל באמת את החיבור, ואז בחרו גרסה נתמכת במקום ללמד תוכנית ישנה אלגוריתם חדש.
openvpn --version openvpn --show-ciphers | grep -i gcm openvpn --show-tls | head -5
אם AES-256-GCM אינו מופיע ברשימה הזו, שום שורת פרופיל לא תוסיף אותו. הפתרון הוא לקוח חדש יותר או גרסה אחרת, ומגבלות הצד הישן יותר הופכות לשאלת תכנון נפרדת.
בלקוחות מבוססי OpenVPN 3 המנוע וההנחיות המתקבלות שונים מקו הקהילה 2.x, ולכן אותו טקסט פרופיל יכול להיכשל מסיבות שאין להן קשר לרשימת הצפנים.
פער במשא ומתן
כששני העמיתים מפרטים את האלגוריתם, נשארת השאלה איזו רשימה כל צד מציע. OpenVPN הקהילתי שינה את שם הנחיית המשא ומתן: ncp-ciphers ב-2.4 הפך ל-data-ciphers ב-2.5, וב-2.6 שורת cipher הישנה משמשת בעיקר לתאימות ולנסיגה ולא להגדרת הקבוצה שנדונה.
לכן שינוי של שורת cipher ישנה בלבד יכול להשאיר את רשימת המשא ומתן ללא שינוי. השורה הישנה עדיין חשובה לנסיגה, וזו משימה נפרדת. ערבוב של השניים יוצר עריכות שלא משנות דבר נראה לעין.
openvpn --version | head -2 grep -n -E '^(data-ciphers|ncp-ciphers|cipher|tls-cipher)' server.conf client.ovpn
השוו את הרשימות של שני הקצוות ואת הודעת הדחייה של השרת. אם החיתוך ריק, יישרו את הרשימות במכוון במקום להעתיק ערך מפוסט שנכתב לגרסה אחרת. רשימה נדיבה מדי מחלישה בשקט כל חיבור. רשימה צרה מדי מוציאה את העמית שרציתם לשמור.
השאירו את התאימות מפורשת
נסיגה עבור עמית ישן אחד היא החלטה עם מחיר: כל הפריסה מקבלת אפשרות חלשה יותר כדי שמכשיר אחד יוכל להתחבר. כתבו זאת כך, והגבילו אותו לעמית שזקוק לכך.
שני תנאים קובעים את התוצאה. אם השגיאה מקומית, החליפו את הגרסה. אם השגיאה במשא ומתן, יישרו את הרשימות בשני הקצוות ורשמו אילו גרסאות אתם תומכים.
לאחר מכן דווחו על השגיאה המדויקת עם פלט הגרסה והיכולות מצורף. הזוג הזה מפריד בין אלגוריתם חסר לבין מחלוקת, ועוצר את הסבב הבא של עריכות השערה לפני שהוא מתחיל.