ACME

Get free TLS certificates from Let's Encrypt with the ACME plugin.

episode
ตอนที่ 18 จาก 20
read
อ่าน 3 นาที

Compose file

เราต้องเพิ่ม env ไปที่ kong service

KONG_LUA_SSL_TRUSTED_CERTIFICATE: system

ส่วนของ proxy ก็เพิ่ม port 8443 เข้าไปด้วย ไม่อย่างนั้น kong จะไม่ทำงานผ่าน ssl ให้เลย

KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 http2 ssl"

ส่วน port ก็ให้ binding แบบนี้

kong จำเป็นต้องเข้าถึง port 80 นะไม่งั้น ACME plugin จะทำ challenge ของ Let’s encrypt ไม่ได้

  • "0.0.0.0:80:8000/tcp"
  • "0.0.0.0:443:8443/tcp"

ดูแค่ service kong นะ

kong-service.yaml
services:
kong:
container_name: kong
image: "${KONG_DOCKER_TAG:-kong:latest}"
user: "${KONG_USER:-kong}"
environment:
<<: *kong-env
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 http2 ssl"
KONG_ADMIN_LISTEN: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
KONG_ADMIN_GUI_LISTEN: "0.0.0.0:8002, 0.0.0.0:8445 ssl"
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_PREFIX: ${KONG_PREFIX:-/var/run/kong}
KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yaml"
KONG_LUA_SSL_TRUSTED_CERTIFICATE: system
KONG_ADMIN_GUI_URL: "https://backend-tgo.dev-env-th.com/kong-manager-ui"
KONG_ADMIN_GUI_API_URL: "https://backend-tgo.dev-env-th.com/kong-manager-api"
KONG_ADMIN_GUI_PATH: "/kong-manager-ui"
secrets:
- kong_postgres_password
networks:
- kong-net
ports:
# The following two environment variables default to an insecure value (0.0.0.0)
# according to the CIS Security test.
# "${KONG_INBOUND_PROXY_LISTEN:-0.0.0.0}:80:8000/tcp"
# "${KONG_INBOUND_SSL_PROXY_LISTEN:-0.0.0.0}:443:8443/tcp"
# Making them mandatory but undefined, like so would be backwards-breaking:
# - "${KONG_INBOUND_PROXY_LISTEN?Missing inbound proxy host}:8000:8000/tcp"
# - "${KONG_INBOUND_SSL_PROXY_LISTEN?Missing inbound proxy ssl host}:8443:8443/tcp"
# Alternative is deactivating check 5.13 in the security bench, if we consider Kong's own config to be enough security here
- "0.0.0.0:80:8000/tcp"
- "0.0.0.0:443:8443/tcp"
- "0.0.0.0:8001:8001/tcp"
- "0.0.0.0:8444:8444/tcp"
- "0.0.0.0:8002:8002/tcp"
healthcheck:
test: ["CMD", "kong", "health"]
interval: 10s
timeout: 10s
retries: 10
restart: on-failure:5
read_only: true
volumes:
- kong_prefix_vol:${KONG_PREFIX:-/var/run/kong}
- kong_tmp_vol:/tmp
- ./config:/opt/kong
security_opt:
- no-new-privileges

แล้ว restart kong ด้วยนะ

Setup ACME Plugin

ใส่ domain ตามชอบ แต่ห้ามใช้ wild card (*) นะ เช่น *.mydomain.com

เลือก kong นะตรงนี้

ต้อง tick ด้วย เพราจะใช้ Let’s encrypt

Setup Routes

ตัวอย่าง เราต้องการจะใช้ ssl กับ domain นี้

  • backend-tgo.dev-env-th.com

เราต้อง เพ่ิม routes สองอันสำหรับ domain นี้

  • /
  • /.well-known/acme-challenge

เสร็จแล้ว

ทดลองสั่ง

curl http://localhost:8001/acme -d host=backend-tgo.dev-env-th.com -d test_http_challenge_flow=true

ให้ลองสั่ง เพื่อให้ acme ไปสร้าง certificate

curl http://localhost:8001/acme -d host=backend-tgo.dev-env-th.com

หรืออันนี้ก็ได้

curl https://backend-tgo.dev-env-th.com -k

หรือไปเข้าเวปตรงๆที่ browser ก็ได้

ตัวอักษรในรูปตัวเล็ก ให้ right click แล้ว open in image in new tab ก็ได้นะ