HTTP over SSL (HTTPS) คืออะไร และ ทำงานอย่างไร (Part1: SSL)

HTTP over SSL หรือ HTTPS นั้นเป็นเทคโนโลยีที่ถูกคิดค้นขึ้นมาเพื่อทำให้เว็บแอปพลิเคชันมีความปลอดภัยจากการดักจับข้อมูล โดย HTTPS ได้นำ Secure Socket Layer (SSL) มาใช้ในการเข้ารหัสข้อมูลที่ต้องการส่ง บทความนี้จะอธิบายถึงหลักการทำงานของ SSL/TLS และการทำงานของ HTTPS เพื่อเป็นพื้นฐานความรู้ในการทำเว็บแอปพลิเคชันให้มีความปลอดภัย

HTTPS_icon

จุดเริ่มต้นของ HTTPS

ในยุคแรกเริ่มของอินเทอร์เน็ตนั้น HTTP เป็นโปรโตคอลที่ใช้ในการแลกเปลี่ยนข้อมูลระหว่าง web client และ web server ซึ่ง HTTP นั้นเป็นโปรโตคอลที่เรียบง่ายโดยหลักการที่ว่า client ส่ง HTTP request มาบอกว่าต้องการข้อมูลของเว็บเพจไหน ส่วน server ก็ทำการส่งข้อมูลนั้นไปในรูปแบบ HTTP response ด้วยความเรียบง่ายของ HTTP จึงได้รับความนิยมอย่างแพร่หลายในยุคปัจจุบัน อย่างไรก็ตาม HTTP request และ HTTP response ที่ถูกส่งเข้าไปในเครือข่ายอินเทอร์เน็ตนั้นไม่ได้มีการเข้ารหัส เนื่องจากผู้รับและผู้ส่งไม่สามารถทราบได้ว่าข้อมูล HTTP request และ HTTP response จะต้องผ่าน router switch หรือ computer เครื่องไหนบ้าง ซึ่งเปิดโอกาสให้ข้อมูลรั่วไหลได้หากมีผู้ดักจับข้อมูลระหว่างทาง จะขอยกตัวอย่างเพื่อให้เห็นภาพได้ชัดขึ้น หากผู้ใช้งานทำการ login ด้วย username และ password เพื่อเข้าเว็บไซต์แห่งหนึ่งด้วย HTTP ผ่าน Wifi ในอินเทอร์เน็ตคาเฟ่ เจ้าของ wifi router ก็สามารถที่จะดักจับข้อมูล username และ password  ของผู้ใช้งานได้เนื่องจากข้อมูลที่ส่งผ่าน HTTP ไม่มีการเข้ารหัส ดังนั้น เพื่อแก้ไขปัญหาที่กล่าวไป เว็บไซต์ส่วนใหญ่ในปัจจุบันจึงหันมาใช้ HTTPS ในการส่งข้อมูลที่ปลอดภัยมากยิ่งขึ้น

รู้จักกับ Secure Socket Layer (SSL)

SSL เป็น protocol พื้นฐานในการสร้าง HTTPS ดังนั้น ความเข้าใจในการทำงานของ SSL เป็นพื้นฐานความรู้ของ HTTPS แรกเริ่ม SSL เป็น protocol ที่ถูกสร้างขึ้นมาเพื่อทำให้การแลกเปลี่ยนข้อมูลมีความปลอดภัยโดยการเข้ารหัส หลักการทำงานของ SSL อย่างง่ายคือ protocol ที่ใช้ในการตกลง algorithm ในการเข้ารหัส การแลกเปลี่ยน public และ private key ก่อนเริ่มทำการแลกเปลี่ยนข้อมูล

การทำงานของ SSL ประกอบไปด้วยการแลกเปลี่ยนข้อมูลเพื่อตกลง algorithm และ secret key ระหว่าง client และ server เรียกว่า SSL handshake ซึ่งมีลำดับของการแลกเปลี่ยนข้อมูลดังรูปด้านล่าง

Screen Shot 2559-01-16 at 5.48.49 PM

ClientHello: เป็นข้อความแรกที่ client ได้ทำการส่งไปหา server เพื่อเริ่มต้นกระบวนการ SSL handshake โดย ClientHello จะประกอบไปด้วย

version number : ข้อมูล SSL version ล่าสุดที่ client รองรับ
random string : เป็น random string ขนาด 32bits ซึ่งจะถูกใช้ในภายหลัง
session identification (optional) : เป็น session id ที่อาจจะมีหรือไม่มีก็ได้ ซึ่ง client จะสามารถใช้ในการกู้คืน session ในกรณีที่ connection หลุด (เป็น null หากเริ่มต้น session ใหม่)
cipher suite: กลุ่มของ encryption algorithm ที่ client รองรับ เช่น TLS_RSA_WITH_DES_CBC_SHA

ServerHello: เป็นข้อความที่ server ตอบกลับ client

version number : ข้อมูล SSL version ล่าสุดที่ server รองรับ
random string : เป็น random string ขนาด 32bits ซึ่งจะถูกใช้ในภายหลัง
session identification (optional) : หาก server ให้กู้คืน session เดิมจะเป็น session id เดียวกับที่ client ส่งมา หรือ server จะส่ง session id ใหม่หากเป็น new session หรือ ไม่ส่งก็ได้หาก server ไม่ต้องการให้กู้คืน session ในอนาคต
cipher suite: กลุ่มของ encryption algorithm ที่ server เลือกใช้ โดยเลือกจาก cipher suite ที่ client รองรับ

ServerCertificate: เป็น certificate (public key) ที่ server ส่งไปให้กับ client โดยส่วนมาก certificate จะออกโดย third-party trust anchor ที่น่าเชื่อถือ เช่น Comodo Symantec GlobalSign เป็นต้น

ServerKeyExchange (optional): เป็น key ที่ server ส่งไปให้กับ client ในกรณีที่ ServerCertificate ไม่มี public key ส่งไปให้กับ client ใช้ในการเข้ารหัส

ClientCertificateRequest (optional): ใช้ในกรณีที่ server ต้องการขอ certificate จาก client (โดยปกติ HTTPS ไม่จำเป็นต้องขอ certificate จาก client)

ServerHelloDone: เป็นการบอก client ว่าการส่งข้อมูลเสร็จสมบูรณ์รอการตอบกลับ

ClientCertificate (optional): ในกรณีที่ server ต้องการ certificate client จะส่งไปให้ (ปกติ HTTPS client ไม่ส่ง certificate ให้ server)

ClientKeyExchange: ข้อความนี้เป็นข้อความสำคัญสำหรับการทำ SSL handshake ทั้ง client และ server จะใช้ random string ที่ได้รับมาและที่ส่งไปในการคำนวน MasterKey (โดยปกติจะใช้ Diffie Hellman algorithm ในการคำนวนหา MasterKey) หลังจากนั้น client จะทำการเข้ารหัส MasterKey ด้วย public key ที่ได้รับมาจาก server และส่งไปให้กับ server

CertificateVerify (optional): ใช้ในการยืนยันสิทธิ์ในการใช้ certificate โดยปกติ HTTPS ไม่ใช้

ChangeCipherSpec: เป็นข้อความที่บอก server ว่าหลังจากนี้ ข้อมูลทุกอย่างจะถูกเข้ารหัสด้วย algorithm ได้ตกลงกัน

ClientFinish: เป็นข้อความที่ client ทำการ hash ข้อมูลทุกอย่างที่ส่งหากัน พร้อมทั้งเข้ารหัสตามที่ตกลงไว้ส่งไปให้ server

ChangeCipherSpec: เป็นข้อความที่บอก client ว่าหลังจากนี้ ข้อมูลทุกอย่างจะถูกเข้ารหัสด้วย algorithm ได้ตกลงกัน

ServerFinish: เป็นข้อความที่ server ทำการ hash ข้อมูลทุกอย่างที่ส่งหากัน พร้อมทั้งเข้ารหัสตามที่ตกลงไว้ส่งไปให้ client

เมื่อ client และ server ได้ทำการตกลงเรื่อง algorithm และ secret key ได้สำเร็จแล้ว ข้อมูลทุกอย่างที่ส่งผ่าน SSL จะถูกเข้ารหัสตามที่ตกลงกันไว้ทั้งหมด SSL version 1 ถูกพัฒนามาตั้งแต่ก่อนปี 1995 และเมื่อพัฒนามาจนถึง version 3 ก็ได้ถูกเปลี่ยนชื่อเป็น Transpart Layer Security (TLS) ปัจจุบัน TLS ถูกพัฒนาจนถึง version 1.3

HTTPS ทำงานอย่างไร

ในความเป็นจริงแล้ว HTTPS ก็คือ HTTP ที่ทำงานบน SSL/TLS นั่นคือ จะมี layer อีกหนึ่งชั้นขั้นกลางระหว่าง HTTP และ Transport Layer ดังในรูปภาพ

Screen Shot 2559-01-16 at 5.54.08 PM

นั่นก็คือ ภายหลังจากที่ทำ SSL handshake แล้ว ข้อมูลที่ส่งกันด้วย HTTP ระหว่างเว็บเบราเซอร์และเว็บเซิร์ฟเวอร์ จะถูกเข้ารหัสด้วย SSL/TLS โดยอัตโนมัติ ทำให้มันจะได้ว่าข้อมูลจะไม่รั่วไหลระหว่างการส่งข้อมูล

สรุป

HTTPS ก็คือ HTTP ที่ทำงานบน SSL/TLS อีกที จุดมุ่งหมายของ HTTPS ก็คือการปกป้องข้อมูลระหว่างต้นทางและปลายทาง บทความนี้อาจจะอธิบายในเชิงลึกที่อาจจะต้องใช้ความรู้พื้นฐานของ security หลายอย่างไม่ว่าจะเป็นเรื่องของ certificate, public key encrpytion, network layer ซึ่งผมจะพยายามเขียนอธิบายในแต่ละหัวข้อเรื่อย ๆ แล้วจะทำ Link มาโพสในบทความนี้ต่อไปครับ

อ้างอิง

1. Introduction to Information Security, Fall 2012, Nicolas Christin

2. SSL/TLS in Detail


Leave a Reply