ทำ web server ให้รองรับ https ด้วย nginx

Prawit Tangmanopeanchai
4 min readSep 21, 2019

--

อันนี้เป็นตอนต่อจากการสร้าง web server ด้วย nginx นะครับ ใครยังสร้างไม่เป็นไปเปิดดูวิธีสร้างก่อนจาก story นี้

ส่วนใครยังไม่รู้จัก https แนะนำให้ไปอ่านจาก story นี้

เราจะมาสร้าง web server ที่รองรับ https กัน โดย domain name ที่เราจะนำมาใช้ทำการทดสอบจะเป็น testhttps.webhop.net (อันนี้ไปใช้บริการจาก dyndns.com)

หลังจากมีชื่อ domain ที่จะใช้ทดสอบแล้วก็เริ่มกันได้เลย โดยขั้นตอนปกติในการทำให้ web server เรารองรับ https นั้นก็เริ่มจาก
1. สร้าง private key
2. นำ private key ไปสร้าง certificate request file แล้วส่งให้กับ CA (องค์กรที่มีหน้าที่รับผิดชอบในการออก certificate) ไปสร้างเป็น public key ส่งมาให้เรา (ซึ่งวิธีนี้ต้องเสียเงิน) หลังจากได้รับ public key มาแล้วก็นำทั้ง private key และ public key ไป config ใน nginx

ก่อนจะเริ่มสร้าง private key, public key เราควรจะเริ่มจากการจัดระเบียบก่อน โดยสร้าง directory เพื่อไว้ใช้สำหรับจัดเก็บ key โดยเราจะไม่นำไปรวมไว้กับที่เก็บ config ของ nginx (ตัวอย่างนี้จะสร้าง directory /opt/certs เพื่อใช้เป็นที่เก็บ key)

sudo mkdir -p /opt/certs

วิธีการสร้าง private key ก็ให้ใช้คำสั่ง

openssl genrsa -out <domain name>.key 2048
เช่น
openssl genrsa -out testhttps.webhop.net.key 2048

ก็จะได้ file ของ private key มา

สังเกตุว่า file private key จะมีคำบอกเลยว่า file นี้เป็น private key นะ

จากนั้นก็มาสร้าง certificate request file กัน โดยใช้คำสั่ง

openssl req -new -key <domain name>.key -out <domain name>.csr
เช่น
openssl req -new -key testhttps.webhop.net.key -out testhttps.webhop.net.csr

เป็นการนำเอา private key ไปสร้างเป็น certificate request file เพื่อใช้ส่งให้กับ CA เพื่อนำไปสร้างเป็น public key ส่งกลับมาให้เรา โดยขั้นตอนในการสร้าง certificate request นี้เราจะต้องระบุรายละเอียดลงไปด้วยว่าเราชื่ออะไร อยู่ประเทศไหน domain ที่ต้องการจะขอ cert ชื่ออะไร บลา บลา บลา …… เราก็กรอกลงไป

เสร็จแล้วเราก็จะได้ certificate request file ออกมา ก็ส่งไปให้ทาง CA เพื่อ gen public key (บางทีเราก็เรียก key ที่ได้รับกลับมาจาก CA ว่าเป็น certificate file) ตัวอย่างของ certificate request file (นามสกุล csr) เป็นดังนี้

จะเห็นใน file เลยว่ามันเป็น certificate request นะ ไม่ใช่ private key หรือ public key เอาไปใช้ทำอย่างอื่นไม่ได้นอกจากใช้ในการนำไปขอ request certificate เท่านั้น

แต่ตอนนี้เรายังไม่อยากเสียตัง ก็เลยต้องสร้าง public key ขึ้นมาใช้เองแทนไปก่อน หรือที่เรียกว่า certificate แบบ self-signed นั่นเอง (คือเป็น cert ที่เราออกเองเนี่ยแหละ ไม่ได้ออกมาจากหน่วยงานที่มีหน้าที่รับผิดชอบโดยเฉพาะอย่าง CA เค้า) ขั้นตอนการสร้างก็ใช้คำสั่ง

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout <domain name>.key -out <domain name>.crt
เช่น
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout testhttps.webhop.net.key -out testhttps.webhop.net.crt

ซึ่งในขั้นตอนการสร้างเราก็ต้องกรอกข้อมูลเหมือนตอนที่เราสร้าง certificate request file ด้วย

เสร็จแล้วเราก็จะได้ certificate file มาเรียบร้อย ชื่อ testhttps.webhop.net.crt

สังเกตุใน file จะบอกเลยว่าเป็น certificate

คราวนี้เราก็ได้ file ที่จะเป็นครบแล้ว ก็เริ่มไปทำการ config ที่ nginx ต่อได้ โดยไปแก้ไขใน file “/etc/nginx/sites-available/default” แล้วทำการเอา comment ที่บรรทัด SSL ออก แล้วระบุที่เก็บ file private key และ certificate key

เสร็จแล้วก็ทำการ save แล้วไปตรวจสอบความถูกต้องของ config เราก่อน ด้วยคำสั่ง

sudo nginx -t

เมื่อเห็นว่า config เราไม่มีปัญหาแล้วก็ทำการ reload nginx เพื่อให้อ่าน config file ที่แก้ไขแล้ว

sudo service nginx reload

ตรวจสอบว่าสามารถใช้งาน https ได้แล้ว โดยดูจากคำสั่ง “netstat -ntl” จะเห็นว่ามี port หมายเลข 443 ตามที่เรา config ไว้ รอให้บริการแล้ว

ถึงเวลาทดสอบ…
ให้เปิด internet browser แล้วในชื่อของ domain name ลงไป

จะเห็นว่าสามารถเปิดหน้า web ขึ้นมาได้แต่ browser จะขึ้นว่า “Not secure” เนื่องจากเราใส่ชื่อ domain เข้าไปเฉย ๆ ตัว browser เองจะไปเรียกใช้บริการ http ที่ port 80 ไม่ใช่ port 443 ที่เป็น https

เพราะฉนั้น หากเราต้องการเรียกใช้ https เราต้องระบุด้วยว่าเราต้องการเข้าโดยใช้ https โดยการใส่ “https://testhttps.webhop.net”

จากนั้นเราก็จะได้หน้านี้

ก็ให้กดที่ปุ่ม Advanced

แล้ว Click ที่ Proceed to testhttps.webhop.net (unsafe)

เราก็จะเข้ามาที่ web page ของ domain ที่เราเรียกแล้ว
ส่วนที่เห็นว่าเป็น “Not secure” ก็เพราะว่า cert ที่เรานำมาใช้เป็น cert แบบ self-signed ซึ่งไม่ได้รับการรับรองจากองค์กรที่ได้รับมอบหมายโดยเฉพาะจึงทำให้ browser แสดงขึ้นมาเป็นแบบนั้น

แต่ไหน ๆ จะทำเป็น https ทั้งทีแล้วก็ไม่ควรปล่อยให้ใครมาเข้าด้วย http ที่ port 80 เหมือนเดิมได้อีก ก็ให้ทำการแก้ไข config ตามนี้

กรอบแรกคือสร้างมาสำหรับรับการ request มาด้วย http ที่ domain “testhttps.webhop.net” หากมีใครเรียกมาด้วย http เราจะทำการ redirect request นี้ไปที่ “https://testhttps.webhop.net” ทั้งหมด

ส่วนกรอบถัดมาเป็น config เดิมที่เราแก้ไขให้เป็น https ก็ให้ทำการปิดการให้บริการของ port 80 ไป

หลังจากแก้ไข config เสร็จแล้วก็ทำตามระเบียบนะครับ ทดสอบความถูกต้องของ config ก่อนทุกครั้ง แล้วทำการ reload config

ครับ และ admin ที่ดีก็ไม่ควรใช้ user “root” ในการทำงานนะครับ ควรใช้คำสั่ง sudo แทน 😄

เท่านี้ไม่ว่าใครจะเรียกมา web เราโดยใส่ https หรือไม่ใส่ ก็จะมาเรียกที่ https เสมอแล้วครับ

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet