TLS (פרוטוקול)
Transport Layer Security > תיאור מהלך התקשרות בסיסי

התרשים משמאל מתאר את הווריאציות השונות של פרוטוקול TLS. האות S מסמלת משלוח מסרים מאומתים מצד השרת. C מסמן אימות לקוח אופציונלי. E מייצג גרסה שבה משתמשים במפתחות ארעיים של פרוטוקול שיתוף מפתח דיפי-הלמן. R פירושו חידוש שיחה. צמד המסרים ChangeCipherSpec/Finished של הלקוח והשרת מתבצעים בסדר שונה אחד מהשני, אילו של השרת נשלחים מיד לאחר ServerHello.
הלקוח פותח התקשרות על ידי משלוח בקשת ClientHello לשרת, המכילה פרטים מזהים, סוג חבילת הצופן שנתמכת על ידו וכן מספר אקראי client_random.
בהתאם למידע שקיבל, השרת קובע את אופן ההתקשרות - סוג חבילת הצופן, מוסיף מספר אקראי משלו server_random ושולח הודעת ServerHello בחזרה ללקוח. חילופי ההודעות נקראים "משא ומתן" (negotiation). שני המספרים האקראיים של השרת והלקוח יהוו חלק מהסוד המשותף של השיחה הנוכחית.
השרת מצרף כמו כן "תעודת מפתח ציבורי" (Public key certificate) תואמת X.509 המכילה את זהותו והמפתח הציבורי שלו. בדרך כלל מדובר במפתח RSA, אם התצורה כוללת פרוטוקול שיתוף מפתח מצורפת תעודת DSS שבדרך כלל נושאת מפתח ציבורי ארוך טווח של פרוטוקול דיפי-הלמן.
הלקוח מאמת את התעודה שקיבל מהשרת באמצעות תעודת השורש (root certificate) שבדפדפן שלו. אם קיים הבדל היררכי בין תעודת השורש שלו לבין תעודת השרת, השרת נדרש לשלוח רשימה מסודרת של כל התעודות הקשורות והלקוח יבדוק את תקפות שרשרת התעודות שקיבל עד שיתקל בתעודת השורש המובנית אצלו. בסיום שלב האימות נשלח המסר הריק ServerHelloDone.
הלקוח מייצר מספר אקראי חדש pre_master_secret, מצפינו באמצעות המפתח הציבורי המאומת של השרת ושולח את התוצאה המוצפנת לשרת במסר ClientKeyExchange. אם נדרש בהתאם לכינון הנוכחי, הלקוח מייצר בנוסף מפתח ארעי (Ephemeral key) לצורך פרוטוקול דיפי-הלמן. אם ברשות הצדדים מפתח ציבורי ארוך טווח של דיפי-הלמן, pre_master_secret יהיה זהה בכל התקשרות.
שני הצדדים גוזרים מפתח שיחה משותף בשני שלבים. תחילה משתמשים בפונקציה פסאודו-אקראית (SHA-2 לפי התקן הנוכחי) כדי לייצר ערך גיבוב מהפרמטרים: pre_master_secret, המחרוזת "master secret", המספר client_random והמספר server_random. ערך גיבוב נקרא master_secret. לאחר מכן חוזרים על פונקציית ה-PRF פעם נוספת ומייצרים ערך גיבוב מתוצאה האחרונה master_secret יחד עם הערכים; המשפט "key expansion", המספר client_random והמספר server_random. התוצאה האחרונה נקראת "בלוק מפתח". בהתאם לחבילת הצופן שנבחרה (עם או בלי אימות), בלוק המפתח מחולק לשישה מקטעים (מפתחות); שני מפתחות הצפנה, שני וקטורי אתחול ושני מפתחות אימות, כל זוג עבור הלקוח והשרת בהתאמה.
השרת יכול לדרוש אימות הלקוח. במקרה זה השרת שולח בקשת CertificateRequest המכילה את סוגי התעודות המותרות (כמו סוג אלגוריתם חתימה) ורשימה של רשויות מאשרות המזוהות בשמן המפורסם.
הלקוח מגיב בהודעת Certificate המכילה תעודת מפתח ציבורי אחת או יותר וכן תמצית (Hash) של כל חילופי המסרים מלחיצת היד, כשהיא חתומה עם המפתח הפרטי המתאים לתעודה.
אם פרוטוקול דיפי הלמן (DH) נבחר, אזי המפתחות הארעיים (Ephemeral keys) הציבוריים של שני הצדדים מוטמעים במסרים KeyExchange של כל אחד מהם בהתאמה. יחד עם המפתחות הפרטיים המתאימים, שני הצדדים מחלצים את הסוד המשותף pre_master_secret. אך צריך לזכור שפרוטוקול דיפי-הלמן הבסיסי אינו מספק הגנה מפני התקפת אדם באמצע.
שני הצדדים מסיימים את לחיצת היד על ידי שני מסרים נוספים ChangeCipherSpec המציין את המעבר לחבילת הצופן החדשה שהוחלט עליה במהלך לחיצת היד וכן הודעת Finished המציינת כי הם מוכנים לעבור למצב מוצפן ומכאן ואילך כל המסרים של שכבת הרקורד יהיו מוצפנים בהתאם.
במקרה של שגיאה או אימות לא מוצלח, תשלח הודעת ההתראה CloseAlert והפרוטוקול והשיחה המשויכת יסתיימו מיד.
הודעת חידוש מאפשרת לשני הצדדים לחדש את ההתקשרות בתהליך מקוצר. כשהשרת תומך בכך, הוא מצרף מחרוזת זיהוי שיחה להודעת ServerHello. במקרה זה הלקוח יכול לציין את מספר השיחה בבקשת ההתחברות שלו מבלי צורך לעבור את כל תהליך לחיצת היד עם האימות. אך עליו לצרף מספר אקראי חדש ולכן מפתח השיחה יהיה שונה בהתאם.