วิธีการ Setup Https ให้กับ APISIX
สวัสดีครับ จากบทความที่แล้ว ผมได้มีการพูดถึงการใช้ APISIX ในการทำ Authentication ให้กับ LLM API ในบทความนี้เราจะมาทำให้ LLM API ของเราปลอดภัยมากยิ่งขึ้นด้วย Https มาเริ่ม Setup กันเลยดีกว่า
โจทย์คือ
เราต้องการให้คนที่เรียกใช้งาน LLM API ของเรา สามารถเรียกใช้ผ่าน Https ได้เท่านั้น
Steps
- เตรียม X.509 Certificate และ Private Key ให้พร้อม
- เพิ่ม X.509 Certificate และ Private Key เข้าไปใน APISIX
- ทดสอบ
เตรียม X.509 Certificate และ Private Key ให้พร้อม
ในบทความนี้ เราจะ Setup Https เป็นแบบ Self-Signed นะครับ ถ้าใครยังไม่แม่นเรื่อง X.509 Certificate และ Https สามารถอ่านเพิ่มเติมได้ที่บทความ ทำความรู้จักกับ X.509 Certificate พื้นฐานสำหรับการทำ Https และ Security อื่น ๆ
ต่อไป จะขอเรียกแทน X.509 Certificate สั้น ๆ ว่า Certificate นะ
การเตรียม Certificate และ Private Key เราจะใช้เครื่องมือที่ชื่อว่า Openssl ซึ่งเป็น Command line ช่วยในการ Generate ดังนี้
openssl req -x509 \
-newkey rsa:4096 \
-keyout key.pem \
-out cert.pem \
-days 365 \
-nodes \
-subj "/C=TH/ST=Bangkok/O=Lotus\'s/CN=llm.lotussdev.com"
คำอธิบาย
- openssl req -x509 — ใช้ Openssl command line ช่วยในการ Generate Certificate (ถ้าไม่มี Command line นี้ ลองหาวิธี Install ดูนะครับ แต่ละ OS อาจจะ Install ไม่เหมือนกัน)
- -newkey rsa:4096 — ให้ Key เป็นแบบ RSA ขนาด 4,096 bits
- -keyout key.pem — ให้ Output ไฟล์ Private Key ออกเป็น key.pem
- -out cert.pem — ให้ Output ไฟล์ Certificate ออกเป็น cert.pem
- -days 365 — Certificate นี้มีอายุ 365 วัน หรือ 1 ปี
- -nodes — มาจาก No DES คือ บอกไม่ให้ Openssl encrypt ไฟล์ Private Key
- -subj “/C=TH/ST=Bangkok/O=Lotus\’s/CN=llm.lotussdev.com” เป็นข้อมูลภายใน Certificate ซึ่งเราใส่แค่ C=Country, ST=State/Province, O=Organization, CN=Common Name หรือก็คือชื่อ Domain Name หรือ Hostname ที่เราต้องการให้เป็น Https
เมื่อเรา Run Command line เสร็จ จะมี 2 ไฟล์ขึ้นมาแบบนี้
ถ้าเราคลิกที่ไฟล์ cert.pem เพื่อดูข้อมูล เราจะเห็นข้อมูลที่เราใส่ไปแบบนี้
เนื่องจาก Certificate นี้ เป็น Certificate ที่เรา Generate ขึ้นมาเองแบบ Self-Signed มันเลยมี Alert แดง ๆ แจ้งเตือนขึ้นมาว่า “This root certificate is not trusted” (ไม่ต้องตกใจ)
เพิ่ม X.509 Certificate และ Private Key เข้าไปใน APISIX
ให้เราทำการเพิ่ม Certificate และ Private Key เข้าไปใน APISIX ผ่าน Admin API แบบนี้
APISIX_ADMIN_BASE_URL="http://localhost:9180"
API_KEY="<YOUR ADMIN API KEY>"
SNI=llm.lotussdev.com
curl -X POST "$APISIX_ADMIN_BASE_URL/apisix/admin/ssls" \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-d '{
"cert" : "'"$(cat ./cert.pem)"'",
"key": "'"$(cat ./key.pem)"'",
"snis": ["'"$SNI"'"],
"ssl_protocols": [
"TLSv1.2",
"TLSv1.3"
]
}'
หมายเหตุ
- ก่อน Run Command ด้านบนให้เรา CD (Change Direcrtory) เข้าไปใน Path ที่มีไฟล์ cert.pem และ key.pem ก่อน
- API-KEY ดูได้จากไฟล์ Configuration ของ APISIX
https://github.com/jittagornp/llm-setup/blob/main/apisix/apisix/config.yaml#L8
เมื่อ Run Command เสร็จแล้ว ให้ไปที่หน้า APISIX Dashboard แล้วไปที่เมนู SSL เพื่อเช็คดูว่า Certificate และ Private Key ที่เราเพิ่มไปตาม Command ด้านบน เข้าไปใน APISIX มั้ย
ถ้าเข้า ที่หน้า SSL List จะแสดงแบบนี้
ทดสอบ
เนื่องจากการ Setup นี้เป็นการทดสอบภายในเครื่องตัวเอง ดังนั้น เราจะทำการ Map Host ที่เครื่องของเราเพื่อทดสอบ Https ดังนี้
แก้ไขไฟล์ /etc/hosts (สำหรับเครื่อง Mac) โดยการเพิ่มบรรทัดนี้เข้าไปในไฟล์
127.0.0.1 llm.lotussdev.com
อย่าลืม Save
จากนั้นลองเข้า https://llm.lotussdev.com/
จะติด Browser Warning เนื่องจาก Certificate นี้เป็น Self-Signed ให้เรา กด Trust Certificate นี้
ตอนนี้ LLM API เราก็สามารถเข้าแบบ Https ได้แล้ว
เพิ่มเติม
เนื่องจากใน Docker compose file เรามีการเปิดทั้ง Port 80 และ 443 ไว้
https://github.com/jittagornp/llm-setup/blob/main/apisix/docker-compose.yml#L28-L29
เราสามารถ
- ปิด Port 80 และเปิดเฉพาะ 443 ได้
- หรือเราจะเปิดทั้ง 80 และ 443 ไว้ แล้วให้เป็นหน้าที่ของ Firewall ว่าให้ Block Port 80 จากภายนอกที่ Call มาก็ได้ครับ