על TLS ו-SSL

אנחנו נתקלים לא מעט במונחים TLS ו-SSL במיוחד בהקשר של HTTPS. אבל מה הם ומה ההבדל ביניהם בדיוק?

קודם כל, TLS (או Transport Layer Security) ו-SSL (או Secure Socket Layers) הם אותו הדבר. בערך. שניהם פרוטוקלי קריפטוגרפיה להצפנת והעברת מידע באופן מאובטח על גבי הרשת. הרבה מאוד אתרי מסחר מקוון מניפים בגאווה לוגו/באנר של SSL ליידע אותנו שהאתר שלהם מאובטח, אבל למרבה האירוניה זה לא מקור לגאווה.

SSL ו-TLS הם אותו פרוטוקול במובן ש-TLS הוא גירסה מעודכנת של ה-SSL, שנזנח. גירסת 1.0 של ה-SSL מעולם לא יצאה לציבור בגלל המון בעיות אבטחה, גירסה 2.0 יצאה ב-1995, שודרגה ל-3.0 ב-1996 ושתיהן יצאו מכלל שימוש ב-2011 ו-2015 בהתאמה. פרוטוקול ה-SSL על כל גירסאותיו סבל מבעיות אבטחה. ב-1999 גם גירסה 3.0 שודרגה על ידי TLS 1.0, שבמקור בכלל היה SSL 3.1. השם שלו שונה מ-SSL ל-TLS כדי להדגיש שהוא כבר לא היה מקושר עם נטסקייפ, שהפסיקה להיות מעורבת בפיתוח בגירסה זו. גם הוא לא היה להיט גדול ולמרות שהחזיק 7 שנים, ב-2006 הגיע ה-TLS 1.1. שתי הגירסאות האלו יצאו משימוש ב-2020. ב-2008 הגיע ה-TLS 1.2, שהחזיק הכי הרבה זמן- עד 2018, כשיצאה הגירסה העדכנית של TLS 1.3.

אז למה אנחנו עדיין קוראים לזה SSL, טכנולוגיה עם המון בעיות אבטחה שנזנחה ב-2015? שיווק והרגל. כל הספקים של תעודות SSL/TLS עדיין קוראים לזה SSL והשם די נדבק. בפועל, מאחר ומדובר באותו פרוטוקול, בערך כל תעודת SSL מאז 1999, כלומר מאז TLS 1.0, תתמוך בשני הפרוטוקולים.

אז איך זה עובד? כשאנחנו מתקינים על השרת שלנו תעודת TLS/SSL, אנחנו למעשה מביאים לו מפתח ציבורי ומפתח פרטי שבאמצעותם השרת מצפין ומפענח את המידע. כאשר המשתמש מתחבר לאתר הדפדפן והשרת מחליפים פרטים ומוצאים גירסת TLS ואלגוריתמי הצפנה ששניהם תומכים בהם כדי שיוכלו לתקשר. בנוסף, כל צד מעביר לשני קוד אקראי כלשהו. באמצעות סוגי ההצפנות שנבחרו והמפתחות של תעודת ה-SSL שני הצדדים הופכים את הקוד האקראי שכל אחד מהם שלח לשני לסיסמה סודית שרק הם יכולים לדעת. באמצעות הסיסמה הם מצפינים את המידע כך שרק הם יכולים לקרוא אותו וכל התקשורת ביניהם מאובטחת. בנוסף, הדפדפן בודק את תעודת ה-SSL כדי לאמת שהשרת מי שהוא טוען שהוא ולא מתחזה. (אם אתם רוצים להעמיק בהצפנת מפתח ציבורי, מוזמנים לקרוא את (הפוסט שכתבנו בנושא)[https://neocode.blog/posts/asymmetric-encryption/]).

עיקר התהליך הוא ה-handshake. ה-handshake מתחיל ברגע שהמשתמש ניגש לשרת דרך HTTPS (לדוגמה ביקור באתר). ה-handshake היא סדרה של מעיין התכתבויות בין הלקוח (משתמש) לשרת, מעיין צ’אט של מחשבים. תחילה הלקוח שולח הודעה שכוללת את גירסת ה-TLS שבה הוא תומך, ומשהו בשם cipher suite, אוסף של אלגוריתמי הצפנה שבהם הוא תומך, כדי שהשרת והוא יוכלו לבחור בשפה ששניהם מבינים. בנוסף הוא שולח מחרוזת אקראית שנקראת client random (אקראי לקוח).

השרת מגיב בהודעה משלו, שכוללת את תעודת ה-SSL של השרת, הצופן (cipher suite) שבו הוא בוחר להשתמש וגם הוא מוסיף מחרוזת אקראית משלו שנקראת server random (אקראי שרת). עד כאן בעצם הלקוח והשרת עשו היכרות ראשונית וסיכמו על “שפה” ששניהם דוברים, והחליפו ביניהם גם איזו מחרוזת מוזרה (תכף תבינו למה).

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

לאחר מכן הלקוח שולח עוד מחרוזת אקראית של תווים, אותה הוא מצפין עם המפתח הציבורי של השרת שנלקח מהתעודה, והשרת מפענח עם המפתח הפרטי שלו. באמצעות ההודעה הזו, שתי המחרוזות המוזרות שנשלחו קודם- אקראי הלקוח ואקראי השרת, הלקוח והשרת מנפיקים session keys (מפתחות שיחה) שאמורים להיות זהים. הם יוצרים את המפתחות עם אותם אלגוריתמי הצפנה,ה-cipher suite שהם בחרו.

השרת והלקוח מודיעים אחד לשני שהם סיימו וממשיכים את התקשורת באמצעות ה-session keys עם הצפנה סימטרית, כלומר לכל צד יש עותק של מפתח סודי שבאמצעותו הם מצפינים וגם מפענחים את התקשורת ביניהם.

כדאי לציין שלא כל ה-handshakes ישתמשו במפתח הפרטי כדי לייצר session keys, למרות שכולן ישתמשו בהצפנה אסימטרית. דוגמה ל-handshake כזה תהיה Diffie-Hellman handshake שמשתמש בפרמטר DH במקום, אבל שאר הדרך זהה.

בשביל שכל התהליך יעבוד יש כמובן צורך בתעודת SSL. התעודה מונפקת על ידי גוף כלשהו ומשמשת לאימות השרת. בוודאי נתקלתם בתעודות שונות במחירים שנעים בין חינם לאלפי דולרים לשנה. ההבדלים נובעים מרמת האימות הדרושה. התעודות הפשוטות, דוגמת החינמיות של Let’s Encrypt, הן מסוג Domain Validation (אימות דומיין). כל מה שצריכים לעשות זה להוכיח שאנחנו הבעלים של הדומיין. רמה מעל תהיה Organization Validation (אימות אירגון). במקרה זה הגוף המנפיק יוצר קשר ישירות עם האדם שמבקש להנפיק את התעודה ולכן תהיה יותר אמינה. לבסוף יש את ה-Extended Validation (אימות מורחב) שדורש בדיקת רקע מלאה של האירגון המבקש את התעודה ולכן גם הכי אמינה. פרמטר נוסף שמשפיע על המחיר הוא היקף הכיסוי- תעודה לדומיין בודד תהיה יותר זולה מתעודת wildcard שמכסה את הדומיין ואת כל הסאב-דומיינים שלו (כלומר גם את wikipedia.org וגם את he.wikipedia.org, en.wikipedia.org וכו’) שתהיה זולה מתעודת מולטי-דומיין המכסה מספר דומיינים שונים ובלתי קשורים.

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

לטעון תגובות?