DEV Community

Kan Ouivirach
Kan Ouivirach

Posted on • Updated on

ว่าด้วยเรื่อง SSL Certificate กับ NGINX

Secure Sockets Layer (SSL) เป็นเทคโนโลยีการเข้ารหัสข้อมูลเพื่อให้การส่งข้อมูลบนโลกอินเตอร์เนทปลอดภัยมากยิ่งขึ้น ข้อมูลที่เรากรอกบนเว็บไซต์ต่างๆ ก็จะถูกดักฟังได้ยากมากขึ้นนั่นเอง สังเกตได้ง่ายๆ ว่าเว็บไซต์ไหนใช้ SSL ดูได้ง่ายๆ เลยคือจะต้องมีไอค่อนแม่กุญแจสีเขียวตรง URL แบบนี้

แม่กุญแจสีเขียวสัญลักษณ์​ SSL ด้านหน้า URL

เราก็มั่นใจได้ในระดับหนึ่งล่ะว่าข้อมูลของเราตอนที่ส่งผ่านโลกอินเตอร์เนทไปยังเว็บเซิฟเวอร์นั้นๆ จะถูกเข้ารหัส ทีนี้ระดับความมั่นใจในความปลอดถัยของเราก็ขึ้นอยู่กับประเภทของ SSL cerfiticate ด้วย ซึ่งมีอยู่ 3 แบบหลักๆ

  1. Domain Validation (DV) เป็นแบบที่ง่ายที่สุด จะมีการตรวจสอบแค่ว่าใครเป็นเจ้าของโดเมนแค่นั้น
  2. Organization Validation (OV) เป็นแบบที่ตรวจสอบมากกว่าแบบแรก ซึ่งอาจจะต้องยื่นเอกสารว่าองค์กรนี้มีอยู่จริงๆ
  3. Extended Validation (EV) เป็นแบบที่ตรวจสอบข้อมูลเชิงลึกของบริษัทนั้นๆ ด้วย สังเกตได้ง่ายๆ ครับ ตรง URL เราจะเห็นแม่กุญแจสีเขียวและชื่อบริษัทนั้นๆ ด้วย ลองดูรูปด้านล่างประกอบ

แม่กุญแจสีเขียวและชื่อธนาคารกสิกรไทย

การเชื่อมต่อแบบ SSL

ก่อนที่เราจะสร้างการเชื่อมต่อแบบ SSL ได้นั้น เว็บเซิฟเวอร์ของเราจำเป็นต้องมี SSL certificate ก่อนน ซึ่งตัว certificate เนี่ยมีวิธีการทำอยู่ 2 แบบ

  1. ทำเองเป็นแบบ self-signed certificate มีข้อดีคือ ง่าย! ไม่ต้องยุ่งกับใคร ข้อเสียคือ จะไม่มีใครเชื่อถือเราเพราะว่าไม่มีใครมารับรอง certificate ที่เราทำขึ้นมาเอง และอีกอย่างคือ.. แม่กุญแจจะไม่เป็นสีเขียว! 😲 ซึ่ง certificate แบบนี้เหมาะสำหรับการทดสอบเฉยๆ นะครับ ไม่สมควรเอาไปใช้งานจริง (นอกจากว่าเราคือ Certificate Authority ซะเอง)
  2. ขอจาก Certificate Authority (CA) ซึ่ง CA เนี่ยคือคนที่สามาถออก SSL certificate ให้เราได้ มีความน่าเชื่อถือ และไม่ฟรี! 💸 เดี๋ยวจะขอพูดถึงวิธีการขอ certificate จาก CA ในหัวข้อถัดไป (จริงๆ แล้วเราสามารถมี certificate แบบฟรีๆ และได้การรับรองด้วยนะ สามารถขอได้ที่ Let's Encrypt)

ขั้นตอนการสร้างการเชื่อมต่อให้ลองดูรูปด้านล่างนี้ประกอบ


How Do SSL Certificates Work? Figure from DZone.

อธิบายคร่าวๆ

  1. ตอนที่เราเข้าเว็บ ตัวเว็บบราวเซอร์ของเราจะส่ง request ไปยังเซิฟเวอร์
  2. เซิฟเวอร์จะส่ง certificate กลับมาหาเว็บบราวเซอร์ เสร็จแล้วเว็บบราวเซอร์ของเราจะเอา certificate ไปหา intermediate certificate และจาก intermediate certificate ก็จะไปหา root certificate อีกเผื่อยืนยันความถูกต้องของ certificate ที่เราได้มาจากเซิฟเวอร์นั้นๆ ปกติเว็บบราวเซอร์บนเครื่องคอมพิวเตอร์จะมีข้อมูลของ intermediate กับ root certificate อยู่แล้วเป็นส่วนใหญ่ ถ้าสงสัยลองอ่าน Explaining the Chain of Trust เพิ่มเติมดูนะ
  3. พอ validate เสร็จ ทีนี้ทางเว็บบราวเซอร์จะส่ง session key ไปให้เซิฟเวอร์ (ใช้แบบ one-time)
  4. เซิฟเวอร์ก็จะจัดการ decrypt ตัว session key นี้ และการส่งข้อความถัดๆ ก็จะผ่านช่องทาง secure session ระหว่างเว็บบราวเซอร์กับเซิฟเวอร์ล่ะ

การขอ Certificate จาก CA

  1. เราจะต้องสร้าง Certificate Signing Request (CSR) ก่อน ซึ่งเราสามารถสร้างได้จากบนเครื่องเซิฟเวอร์ของเราเอง ตอนสร้างจะมีให้เรากรอกข้อมูลองค์กรของเรา เราก็กรอกให้ครบถ้วนที่สุดเท่าที่ทำได้ครับ
  2. พอกรอกเสร็จแล้วเราจะได้ไฟล์มา 2 ไฟล์คือ ไฟล์ private key และไฟล์ CSR ออกมา ซึ่งไฟล์ CSR นี่จะมีข้อมูลองค์กรของเราและมี public Key อยู่ข้างในด้วย
  3. หลังจากนี้เราก็ส่งไฟล์ CSR ให้กับ CA แล้วรอเค้า validate ข้อมูลต่างๆ ใช้เวลาไม่กี่นาทีครับ (ถ้าเป็น certificate แบบ DV นะ ที่ง่ายที่สุด) แล้วเราก็จะได้ไฟล์​ certificate มา (ส่วนใหญ่จะเป็นสกุล *.crt หรือ *.cer) ในไฟล์นี้จะมี public key ของเรา และ signature ที่ออกโดย CA นั้นๆ อยู่

การติดตั้ง SSL Certificate กับ NGINX

การติดตั้งกับ NGINX สามารถทำได้โดยเอาไฟล์ certificate *.crt กับ private key *.key ขึ้นไปวางบนเซิฟเวอร์แล้วแก้ไฟล์ NGINX configuration ตามนี้ได้เลยครับ

server {
  listen 80 default_server;
  listen 443 ssl;

  ssl_certificate my_certificate.crt;
  ssl_certificate_key my_private.key;

  # ...
}

พอเสร็จแล้วก็ reload แล้วเราก็น่าจะเห็นไอค่อนแม่กุญแจเขียวๆ ตรง URL ล่ะ (ถ้าเราเอา certificate มาจาก CA นะ) หรือทดสอบ SSL ของเซิฟเวอร์เราที่เว็บ SSL Server Test ก็ได้

ถ้าแม่กุญแจยังไม่เขียว? ส่วนใหญ่ที่ผมเจอปัญหานี้ จะเจอเฉพาะบนมือถือครับ คือเป็นไปได้ว่าเราอาจจะเชื่อม Chain of Trust ไม่ครบครับ ซึ่งตรงนี้ปกติ CA จะให้ไฟล์ intermediate certificate เรามาด้วย สิ่งที่เราต้องทำก็คือให้เราเอา certificate นี้ไป append เข้าไปกับไฟล์ certificate *.crt ของเราครับ แล้วลองทดสอบอีกทีก็น่าจะได้ล่ะ

Oldest comments (0)