לחיצת היד של TLS מוסברת שלב אחר שלב - מה קורה לפני שספרה אחת מהאתר מגיעה אליכם¶
אתם יודעים שהמנעול הירוק ליד כתובת האתר אומר "החיבור מוצפן". אבל לפני שאפילו בית אחד של תוכן האתר מגיע אליכם, קורה תהליך שלם שנקרא לחיצת יד - TLS handshake - שבו הדפדפן והשרת, שאף פעם לא דיברו קודם, מצליחים להסכים על מפתח הצפנה סודי, בלי ששום דבר רגיש עובר בגלוי ברשת. בואו נפרק את זה לשלבים אמיתיים.
למה בכלל צריך לחיצת יד לפני שמדברים¶
הדפדפן והשרת לא חולקים סוד מראש. הם צריכים להסכים על שני דברים - איזה מפתח סימטרי ישמש להצפנת כל השיחה בהמשך (כי הצפנה סימטרית מהירה, כפי שהסברנו בפוסט על הצפנה סימטרית ואסימטרית), ואיך לוודא שהשרת שמדברים איתו הוא באמת מי שהוא טוען שהוא, ולא תוקף שמתחזה. לחיצת היד פותרת את שני הדברים האלה בכמה חילופי הודעות בלבד.
השלבים ב-TLS 1.3, הגרסה המודרנית¶
TLS 1.3 צמצם את התהליך למספר קטן של הודעות, ונראה בערך כך:
- ClientHello. הדפדפן פותח בהודעה שאומרת בעצם "אני רוצה חיבור מוצפן", ומצרף רשימת אלגוריתמי הצפנה שהוא תומך בהם, וגם מפתח ציבורי זמני משלו שנוצר במיוחד לחיבור הזה.
- ServerHello, תעודה, ומפתח. השרת בוחר את אלגוריתם ההצפנה החזק ביותר המשותף לשניהם, שולח את תעודת ה-SSL/TLS שלו כדי להוכיח את זהותו, ומצרף מפתח ציבורי זמני משלו. ברגע הזה, שני הצדדים כבר מחזיקים מספיק מידע כדי לחשב, כל אחד בנפרד, בדיוק אותו מפתח סימטרי משותף - בזכות טריק מתמטי שנקרא Diffie-Hellman, שמאפשר לשני צדדים להגיע לאותו סוד בלי לשלוח אותו ברשת בכלל.
- אימות התעודה. הדפדפן בודק שהתעודה שהשרת שלח נחתמה על ידי גורם אמון (רשות אישורים, שעליה נרחיב בפוסט נפרד), ושהשם באתר תואם לתעודה. אם משהו לא תואם, הדפדפן מציג אזהרת "חיבור לא בטוח" ועוצר.
- Finished. שני הצדדים שולחים הודעת אישור מוצפנת כבר עם המפתח החדש שחושב, כדי לוודא ששניהם באמת הגיעו לאותו מפתח בדיוק. מהרגע הזה, כל התעבורה - כל דף, כל תמונה, כל בקשה - מוצפנת עם המפתח הסימטרי המהיר.
כל התהליך הזה, בגרסת TLS 1.3, קורה בסבב תקשורת אחד בלבד (round trip אחד) בין הדפדפן לשרת, מה שהופך אותו למהיר מספיק שאתם בכלל לא מרגישים אותו.
למה TLS 1.3 מהיר יותר מקודמיו¶
בגרסאות ישנות יותר כמו TLS 1.2, התהליך דרש שני סבבי תקשורת נפרדים - קודם משא ומתן על אלגוריתמים, ורק אחר כך חילוף המפתחות עצמו. TLS 1.3 איחד את השלבים, כי הוא הניח מראש שהדפדפן ינחש נכון את רוב הפרמטרים כבר בהודעה הראשונה, וויתר לגמרי על אלגוריתמי הצפנה ישנים וחלשים שהיו עדיין נתמכים בגרסאות קודמות. התוצאה היא לחיצת יד מהירה משמעותית, וגם בטוחה יותר, כי פחות אפשרויות ישנות אומר פחות דרכים לתקוף.
חיבור חוזר - כשלא צריך לעשות את כל זה מחדש¶
אם התחברתם לאתר, ואז ניגשתם אליו שוב תוך זמן קצר, TLS 1.3 מאפשר "חידוש סשן" (session resumption) - הדפדפן והשרת שומרים מידע מהחיבור הקודם, ומצליחים להגיע למפתח משותף חדש כמעט מיד, בלי לעבור שוב על כל שלבי האימות המלאים. זו הסיבה שגלישה באתר שכבר ביקרתם בו מרגישה מהירה יותר מביקור ראשון.
למה כדאי להבין את זה לעומק¶
הבנת לחיצת היד של TLS מסבירה למה אתרים עם תעודה פגומה חוסמים אתכם לגמרי, למה שינוי שעון המערכת שלכם יכול לשבור חיבורים מוצפנים, ולמה תוקפים כמעט אף פעם לא מנסים "לשבור" את ההצפנה עצמה, אלא מחפשים דרכים לעקוף את שלב אימות התעודה. זה בדיוק הבסיס שאנחנו בונים עליו בקורס הרשתות, כולל ניתוח לחיצת יד אמיתית בכלים כמו Wireshark.
קורס הרשתות המלא נמצא כאן, חינם ובעברית, עם תרגול מעשי על TLS ותעבורה מוצפנת.
יש לכם שאלה על לחיצת יד שנכשלת אצלכם? שאלו בדיסקורד.
לסיכום¶
לחיצת היד של TLS היא תהליך קצר אבל מהודק - הסכמה על אלגוריתם, חישוב מפתח משותף בלי לשלוח אותו ברשת, ואימות זהות באמצעות תעודה. כל זה קורה תוך מילישניות ספורות, בכל אתר עם HTTPS שאתם נכנסים אליו, בלי שתצטרכו לחשוב על זה בכלל.