Hướng dẫn cấu hình Caddy Server làm Reverse proxy: Tự động gia hạn SSL cho VPS
Bạn đã bao giờ rơi vào cảnh đang ngủ ngon lúc 2 giờ sáng thì điện thoại réo liên tục vì hệ thống giám sát báo website ngừng hoạt động? Mở máy tính lên, đập vào mắt là màn hình cảnh báo đỏ chót Your connection is not private. Lỗi không phải do code, không phải do database, mà chỉ vì cái cronjob chạy lệnh certbot renew trên Nginx tự nhiên gặp sự cố không hoạt động, khiến chứng chỉ SSL hết hạn.
Việc phải ngồi hì hục thiết lập Virtual Host, xin chứng chỉ Let’s Encrypt, viết script tự động gia hạn rồi thấp thỏm lo âu mỗi 90 ngày vốn là nỗi đau chung của rất nhiều anh em developer và sysadmin. Để giải quyết triệt để vấn đề này, việc cấu hình Caddy Server đang trở thành tiêu chuẩn mới, thay thế hoàn toàn những thiết lập thủ công rườm rà trước đây. Giải pháp này giúp biến hạ tầng của bạn thành một cỗ máy set-and-forget (cài đặt một lần rồi quên đi).
Vậy Caddy vận hành cơ chế tự động hóa chứng chỉ ra sao dưới nền? Làm thế nào để setup một Reverse proxy an toàn, chịu tải tốt chỉ với 3 dòng code và loại bỏ hoàn toàn các cronjob gia hạn thủ công?
Tại sao nên dùng Caddy thay vì Nginx hay Apache?
Caddy không phải là một bản Nginx rút gọn. Đây là một web server độc lập được viết bằng ngôn ngữ Go, mang trong mình triết lý thiết kế hoàn toàn khác biệt: HTTPS phải là tiêu chuẩn mặc định, không phải là một module yêu cầu bạn tự tay lắp ghép.
Tự động hóa SSL tuyệt đối (Auto-HTTPS)
Với mô hình Nginx hay Apache truyền thống, bạn bắt buộc phải cài đặt thêm Certbot (một ACME client bên thứ 3). Khi hoạt động, bạn phải trỏ đường dẫn file cert/key vào file cấu hình, rồi thiết lập systemd timer hoặc cronjob để gia hạn. Nếu deploy-hook (lệnh tải lại server sau khi gia hạn) bị lỗi, chứng chỉ mới nằm trên ổ cứng nhưng server vẫn dùng chứng chỉ cũ.
Caddy loại bỏ toàn bộ chuỗi phụ thuộc này. Nó sở hữu một thư viện ACME tích hợp sẵn có tên là CertMagic. Ngay khi bạn khai báo một tên miền hợp lệ trong file cấu hình, Caddy tự động sinh khóa riêng tư (Private Key), gọi thử thách xác thực (challenge), tải chứng chỉ về và nạp trực tiếp vào bộ nhớ RAM. Không Certbot, không bash script, không cronjob.
Cấu hình tối giản đến bất ngờ
Thay vì phải chật vật tìm hiểu cách cấu hình Nginx làm Proxy ngược với những file nginx.conf dài hàng trăm dòng với vô số khối server {} và location {} lồng nhau chỉ để trỏ domain về một port backend, thì với Caddy, mọi thứ được quản lý tập trung trong một file duy nhất mang tên Caddyfile. Cú pháp thiết kế theo xu hướng khai báo (declarative) giúp bạn thiết lập một Reverse proxy production-ready chỉ tốn đúng 3 dòng lệnh.
Hiện đại và bảo mật mặc định
Nếu dùng Nginx, bạn phải tự viết một khối máy chủ ảo ở cổng 80 chỉ để làm nhiệm vụ chuyển hướng người dùng sang HTTPS. Với Caddy, việc HTTP redirect sang HTTPS là hành vi mặc định không cần khai báo. Thêm vào đó, Caddy tự động bật sẵn giao thức HTTP/2 và HTTP/3, tự động lựa chọn các bộ mã hóa (cipher suites) mạnh mẽ nhất và hỗ trợ OCSP Stapling mà bạn không cần phải là một chuyên gia về bảo mật mật mã.
Bảng so sánh nhanh cấu hình Reverse proxy:
| Tiêu chí | Mô hình truyền thống (Nginx + Certbot) | Mô hình hiện đại (Caddy Server) |
| Cấp SSL lần đầu | Cài Certbot riêng, gõ lệnh thủ công, sửa file config. | Tự động hoàn toàn ngay khi khởi động. |
| Gia hạn SSL | Cần Cronjob, dễ lỗi nếu reload service thất bại. | Chạy ngầm liên tục trong nhân (core) của Caddy. |
| Chuyển hướng HTTPS | Tự viết riêng cấu hình rewrite từ cổng 80. | Tự động mặc định. |
| Độ phức tạp file config | Dài dòng, chia nhiều thư mục (sites-available). |
Một file duy nhất, gọn gàng, cú pháp siêu ngắn. |

Caddy Server tích hợp sẵn module SSL tự động, loại bỏ hoàn toàn sự phức tạp của Certbot và Cronjob trên mô hình Nginx truyền thống.
Hướng dẫn cấu hình Caddy Server trên VPS (step-by-step)
Để bắt tay vào thực hành, bạn cần chuẩn bị một VPS chạy Linux (khuyến nghị Ubuntu 22.04 hoặc 24.04 LTS), có quyền root hoặc sudo. Đảm bảo ứng dụng backend của bạn (Node.js, Python FastAPI, Go, hoặc Docker) đang chạy ổn định ở một port nội bộ, ví dụ 3000.
Bước 1: Cài đặt Caddy từ repo chính thức
Một sai lầm phổ biến của sysadmin mới là cài Caddy từ kho lưu trữ mặc định của hệ điều hành (ví dụ: Ubuntu Universe). Các gói này thường đã lỗi thời và thiếu các module cần thiết. Bạn luôn phải cài từ repository chính thức để đảm bảo nhận các bản vá bảo mật và tính năng mới nhất.
Chạy chuỗi lệnh chuẩn sau trên Ubuntu/Debian:
Cài đặt các gói bổ trợ cần thiết để tải kho khóa an toàn:
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
Tải và cấu hình khóa GPG chính thức của nhà phát triển:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
Thêm danh sách repository chính thức vào hệ thống:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
Cập nhật lại danh sách gói và tiến hành cài đặt:
sudo apt update
sudo apt install -y caddy
Kiểm tra hệ thống đã nhận diện thành công hay chưa bằng lệnh: caddy version. Hệ thống cũng sẽ tự động tạo một systemd service chạy ngầm.
Bước 2: Chuẩn bị hạ tầng mạng (cực kỳ quan trọng)
Caddy cần giao tiếp với Tổ chức phát hành chứng chỉ (như Let’s Encrypt) qua mạng Internet để chứng minh bạn là chủ sở hữu hợp pháp của tên miền. Nếu bước này sai, cơ chế Auto-HTTPS sẽ tê liệt.
- Trỏ DNS: Truy cập trang quản lý DNS của tên miền (Cloudflare, Namecheap…), tạo bản ghi A và trỏ giá trị về đúng địa chỉ IP public của con VPS.
- Mở tường lửa (Firewall): VPS phải được mở luồng giao thông cho cổng 80 (TCP) và 443 (TCP/UDP). Lưu ý, nếu bạn dùng AWS EC2 hay Vultr, bạn phải mở port ở tầng hạ tầng mạng (Security Groups / Cloud Firewall) bên cạnh việc cấu hình UFW Ubuntu trực tiếp bên trong VPS.
Bước 3: Viết Caddyfile làm Reverse proxy
Khác với Nginx, Caddy chỉ cần một file duy nhất. Hãy mở file cấu hình mặc định:
sudo nano /etc/caddy/Caddyfile
Xóa toàn bộ nội dung mẫu và thay bằng cấu hình thực chiến sau đây (nhớ đổi api.yourdomain.com thành tên miền thực của bạn):
# Cấu hình Global: Khai báo email để nhận cảnh báo khẩn cấp từ Let's Encrypt
{
email [email protected]
}
# Block cấu hình cho ứng dụng backend
api.yourdomain.com {
# Tự động nén dữ liệu bằng thuật toán hiện đại để tiết kiệm băng thông
encode zstd gzip
# Trỏ traffic về app đang chạy trực tiếp trên VPS ở port 3000
reverse_proxy localhost:3000
}
Lưu ý: Nếu bạn chạy backend bên trong Docker, KHÔNG sử dụng localhost:3000 (vì localhost của Caddy container sẽ trỏ vào chính nó). Thay vào đó, hãy khai báo tên service: reverse_proxy app-container-name:3000.

Luồng hoạt động của Reverse Proxy: Caddy tiếp nhận kết nối HTTPS, giải mã SSL và chuyển tiếp HTTP nội bộ vào ứng dụng backend.
Bước 4: Validate và khởi động lại không downtime
Trước khi áp dụng cấu hình mới, một thao tác bắt buộc của các developer kỳ cựu là kiểm tra lỗi cú pháp (syntax validation) để tránh việc gõ nhầm dấu ngoặc nhọn {} làm gián đoạn dịch vụ:
Lệnh kiểm tra cấu trúc (Sẽ báo Valid configuration nếu đúng):
caddy validate --config /etc/caddy/Caddyfile
Áp dụng cấu hình nóng, không làm rớt các request đang được xử lý:
sudo systemctl reload caddy
Ngay sau khi lệnh reload chạy xong, hãy mở trình duyệt và truy cập vào https://api.yourdomain.com. Bạn sẽ thấy biểu tượng ổ khóa xanh quen thuộc. Toàn bộ quá trình từ lúc gõ lệnh cài đặt đến khi web chạy HTTPS chưa tốn đến 5 phút.
Cơ chế tự động gia hạn SSL của Caddy hoạt động ra sao?
Hiểu được cách Caddy hoạt động dưới nền (background) sẽ giúp bạn hoàn toàn an tâm phó thác hạ tầng bảo mật cho nó. Không giống như việc phụ thuộc vào một cronjob thụ động cứng nhắc, Caddy chủ động tính toán vòng đời và xử lý mượt mà qua 3 tính năng cốt lõi:
Thuật toán gia hạn sớm (Renewal Window Ratio)
Caddy không bao giờ đợi đến khi chứng chỉ chỉ còn 7 ngày mới lo đi gia hạn. Thay vào đó, thuật toán của CertMagic sử dụng công thức 2/3 vòng đời. Với chứng chỉ Let’s Encrypt mặc định có hạn 90 ngày, ngay khi chứng chỉ hoạt động được 60 ngày (vừa chạm mốc 2/3), Caddy sẽ tự động lên lịch chạy quy trình xin cấp mới dưới nền. Điều này cho phép hệ thống có dư dả 30 ngày để xử lý nếu có bất kỳ sự cố kết nối mạng nào xảy ra.
Cơ chế chuyển đổi dự phòng thông minh (Issuer Fallback)
Nếu bạn dùng Certbot, khi API của Let’s Encrypt bảo trì hoặc bạn bị phạt rate-limit, quy trình gia hạn sẽ bị đình trệ. Để giải quyết, Caddy mặc định cấu hình song song cả hai Tổ chức phát hành: Let’s Encrypt và ZeroSSL. Nếu luồng yêu cầu đến Let’s Encrypt gặp sự cố, Caddy ngay lập tức tự động fallback (chuyển hướng) sang ZeroSSL để xin chứng chỉ thay thế. Hệ thống của bạn luôn được trang bị bảo vệ kép.
Nạp nóng không rớt kết nối (Zero-Downtime Reload)
Khi một chứng chỉ mới được tải về, nó sẽ được ghi đè vào thư mục /var/lib/caddy/.local/share/caddy. Caddy sẽ tự động đọc chứng chỉ này, thay thế cấu trúc dữ liệu bên trong bộ nhớ RAM và bắt đầu phục vụ các request TLS mới. Các kết nối cũ của khách hàng vẫn duy trì ổn định mà không yêu cầu bạn phải systemctl restart caddy.

Thuật toán Renewal Window Ratio: Caddy chủ động gia hạn chứng chỉ tại mốc 2/3 vòng đời (ngày 60) và tự động fallback sang ZeroSSL nếu gặp sự cố mạng.
Cấu hình nâng cao cho webmaster & developer
Khi dự án của bạn scale lớn hơn, một cấu hình Reverse proxy cơ bản là không đủ. Việc cấu hình Caddy Server còn hỗ trợ vô số tính năng mạng mạnh mẽ giúp tối ưu hóa luồng request và bảo mật ở tầng cao.
Tự động hóa proxy cho Docker bằng caddy-docker-proxy
Khi hệ thống scale lên, thao tác đầu tiên là bạn phải cài đặt Docker trên VPS Ubuntu. Nếu bạn đang vận hành một hệ thống Microservices với hàng chục container và liên tục deploy các module mới, việc phải mở Caddyfile ra viết thêm dòng reverse_proxy và gõ lệnh reload mỗi lần khá mất thời gian.
Giải pháp hiện đại mà cộng đồng developer đang áp dụng là dùng plugin caddy-docker-proxy. Thay vì chạm vào Caddyfile, bạn chỉ cần gán các labels trực tiếp vào file docker-compose.yml. Caddy sẽ tự động lắng nghe socket của Docker, tự động sinh ra cấu hình routing và xin SSL ngay khi container vừa boot lên xong.
Ví dụ cấu hình docker-compose.yml cho một service backend:
services:
api-service:
image: node-backend:latest
networks:
- caddy_net
labels:
# Định nghĩa tên miền
caddy: api.yourdomain.com
# Tự động proxy vào port 3000 của container này
caddy.reverse_proxy: "{{upstreams 3000}}"
Với kiến trúc này, máy chủ trở thành một môi trường zero-touch deployment. Bạn scale bao nhiêu bản sao container, Caddy tự động nhận diện và cân bằng tải bấy nhiêu, hoàn toàn rảnh tay.
Khắc phục lỗi không thể mở port 80 bằng thử thách DNS-01
Trong điều kiện lý tưởng, hệ thống dùng thử thách HTTP-01 yêu cầu VPS phải mở port 80 ra internet. Tuy nhiên, nếu bạn đang dựng hệ thống nội bộ (Homelab), đặt máy chủ tại nhà bị nhà mạng (ISP) chặn port 80, hoặc server nằm sâu phía sau tường lửa nội bộ, Caddy sẽ không thể xác minh domain theo cách thường.
Lúc này, giải pháp cứu cánh là dùng phương thức DNS-01 Challenge. Cơ chế này cho phép Caddy chứng minh quyền sở hữu bằng cách giao tiếp qua API để tự động tạo và xóa một bản ghi TXT trên hệ thống quản lý tên miền (như Cloudflare). Máy chủ của bạn không cần mở bất kỳ cổng nào ra Internet.
Cách triển khai:
Bạn cần tải binary Caddy đã biên dịch sẵn plugin quản lý DNS (thông qua lệnh xcaddy hoặc trang tải xuống). Sau đó, cấu hình như sau:
internal.yourdomain.com {
tls {
# Đọc API Token của Cloudflare từ biến môi trường của hệ điều hành
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
reverse_proxy 192.168.1.100:8080
}
Cân bằng tải đơn giản (Load Balancing)
Để gánh lượng lớn request, nếu bạn có nhiều instance backend chạy ở các port khác nhau (hoặc các VPS khác nhau), Caddy xử lý cân bằng tải cực kỳ tinh gọn:
api.yourdomain.com {
# Khai báo các upstream server
reverse_proxy localhost:3001 localhost:3002 localhost:3003 {
# Thuật toán quay vòng
lb_policy round_robin
# Ping kiểm tra sức khỏe backend định kỳ, nếu ngừng hoạt động sẽ tự loại ra khỏi pool
health_uri /health
health_interval 10s
health_timeout 2s
}
}
Chống spam bằng Matcher & cắt kết nối tầng TCP (abort)
Các hệ thống VPS public rất hay bị các con bot rà quét tự động liên tục spam request vào các đường dẫn nhạy cảm (như .env, wp-admin, .git). Nếu bạn dùng Nginx trả về mã lỗi 403 Forbidden hay 404 Not Found, máy chủ vẫn phải hao tốn CPU/RAM để xử lý HTTP Header phản hồi.
Đây là một trong những kỹ năng bảo mật VPS Linux cực kỳ hiệu quả. Với Caddy, bạn có một lệnh phòng thủ triệt để và tiết kiệm tài nguyên hơn: lệnh abort. Thay vì trả lời bot, lệnh này lập tức cắt đứt (drop) kết nối ngay ở tầng mạng TCP. Kẻ tấn công sẽ bị treo request đến khi timeout hoặc nhận lỗi connection reset trắng xóa.
yourdomain.com {
# Định nghĩa tập hợp các đường dẫn thường xuyên bị spam rà quét
@blocked_paths {
path /*.php /wp-admin* /xmlrpc.php /.env /.git*
}
# Drop kết nối TCP ngay lập tức, không phản hồi bất kỳ Byte nào
abort @blocked_paths
# Nếu request hợp lệ, chuyển tiếp bình thường vào backend
reverse_proxy localhost:3000
}
Troubleshooting: Bắt bệnh các lỗi thường gặp khi cấu hình Caddy Server
Dù là một phần mềm thông minh, trong quá trình triển khai thực tế trên các môi trường phức tạp, bạn vẫn có thể đối mặt với một số lỗi hạ tầng. Dưới đây là cách debug nhanh gọn như một sysadmin chuyên nghiệp:
Lỗi Caddy không khởi động vì Port 80/443 already in use
- Triệu chứng: Khi chạy
systemctl status caddy, bạn thấy dòng log báo đỏ vì không thể bind (gắn) vào cổng mạng. - Nguyên nhân: Chắc chắn 99% hệ thống của bạn vẫn còn tồn dư một tiến trình Nginx, Apache hoặc một container Docker đang chiếm giữ cổng 80/443.
- Cách giải quyết: Chạy lệnh
sudo ss -tlnp | grep -E ':80|:443'để tìm ID tiến trình (PID) của thủ phạm. Nếu đó là Nginx cũ, hãy dọn dẹp bằng lệnh:sudo systemctl stop nginx sudo systemctl disable --now nginx sudo systemctl restart caddy
Trình duyệt báo lỗi 502 Bad Gateway
- Triệu chứng: Tên miền đã có ổ khóa xanh HTTPS, nhưng màn hình hiển thị lỗi 502 trắng xóa.
- Nguyên nhân: Caddy vẫn hoạt động tốt, nhưng nó không thể đẩy request tới ứng dụng backend (hoặc backend từ chối kết nối).
- Cách giải quyết:
- Đứng trực tiếp trên VPS, gõ lệnh
curl -v http://localhost:3000(đổi thành port ứng dụng của bạn). Nếu trả về Connection refused, tức là app backend của bạn bị ngừng hoạt động hoặc đang listen sai IP (ví dụ listen trên127.0.0.1thay vì0.0.0.0trong môi trường Docker). - Nếu ứng dụng báo lỗi Invalid Host Header (thường gặp ở Django/Rails), bạn cần thêm cấu hình forward header trong Caddyfile:
reverse_proxy localhost:3000 { header_up Host {host} }
- Đứng trực tiếp trên VPS, gõ lệnh
Lỗi trình duyệt quay tròn, không xin được SSL (Timeout)
- Triệu chứng: Bạn khởi động Caddy nhưng khi truy cập tên miền, trình duyệt báo ERR_CONNECTION_TIMED_OUT hoặc không có chứng chỉ bảo mật. Kiểm tra log (
journalctl -u caddy -f) thấy liên tục báo lỗi acme challenge failed. - Nguyên nhân: Caddy không thể chứng minh tên miền. Các thủ phạm phổ biến bao gồm:
- DNS chưa cập nhật: IP tên miền trỏ sai hoặc chưa propagate (lan truyền) trên toàn cầu.
- Firewall chặn ngang: AWS Security Group chặn port 80.
- Cloudflare Proxy (Đám mây màu cam): Nếu bạn bật proxy của Cloudflare nhưng cấu hình SSL ở mức Flexible, luồng giao thông sẽ bị chuyển hướng liên tục gây ra lỗi Too many redirects, hoặc Let’s Encrypt không thể xác minh IP gốc. Hãy chuyển Cloudflare SSL sang chế độ Full (Strict) hoặc tắt đám mây cam (chuyển sang DNS-only) trong lúc Caddy xin cấp SSL lần đầu.
Câu hỏi thường gặp (FAQ)
1. Có cần cài Certbot khi dùng Caddy không?
Không. Caddy đã tích hợp sẵn thư viện quản lý chứng chỉ (CertMagic) ngay trong nhân hệ thống. Bạn hoàn toàn không cần cài đặt Certbot, cronjob hay bất kỳ công cụ bên thứ 3 nào khác.
2. Caddy có thực sự tự động gia hạn SSL 100% không?
Có. Khi chứng chỉ chỉ còn khoảng 30 ngày sử dụng (qua 2/3 vòng đời), Caddy sẽ âm thầm chạy ngầm quy trình xin cấp mới và nạp thẳng vào RAM. Mọi thứ là set-and-forget (cài một lần và quên đi).
3. Caddy có hỗ trợ Docker không?
Có, và hỗ trợ cực kỳ mạnh. Bạn có thể chạy Caddy dưới dạng container độc lập, hoặc dùng plugin caddy-docker-proxy để Caddy tự động đọc các labels trong docker-compose.yml, từ đó tự động sinh cấu hình và lấy SSL mà không cần chạm tay vào Caddyfile.
4. Caddy có hỗ trợ cấp chứng chỉ Wildcard SSL (*.yourdomain.com) không?
Có. Tuy nhiên, Let’s Encrypt bắt buộc chứng chỉ Wildcard phải dùng thử thách DNS. Bạn chỉ cần cài phiên bản Caddy có tích hợp plugin DNS (ví dụ: Cloudflare), khai báo API Token vào cấu hình để hệ thống tự động xử lý.
5. Nếu VPS bị mất mạng đúng lúc Caddy đang gia hạn SSL thì sao?
Không sao cả. Caddy gia hạn sớm trước 30 ngày nên có rất nhiều thời gian thử lại. Nếu API của Let’s Encrypt ngừng hoạt động, Caddy sẽ tự động kích hoạt cơ chế dự phòng (Fallback) sang ZeroSSL để xin chứng chỉ thay thế.
6. Tôi có thể chạy Caddy song song với Nginx trên cùng một VPS không?
Được, nhưng phải chia port. Hai web server không thể cùng lúc chiếm port 80/443. Cách tối ưu: Để Caddy đứng ngoài cùng giữ port 80/443 lo Auto-HTTPS, sau đó proxy traffic ngược về Nginx đang chạy ở một port nội bộ (ví dụ: 8080).
7. Chuyển đổi hệ thống từ Nginx sang Caddy có bị Downtime lâu không?
Gần như bằng 0 (tính bằng giây). Bạn chỉ cần viết và test cấu trúc Caddyfile trước (caddy validate). Sau đó, tắt Nginx (systemctl stop nginx) và bật Caddy ngay lập tức. Hệ thống sẽ tự cấp SSL trong vài giây và hoạt động bình thường.
Kết luận
Việc chuyển đổi từ hệ sinh thái truyền thống sang quá trình cấu hình Caddy Server làm Reverse proxy là một khoản đầu tư công sức mang lại lợi nhuận tức thì. Bạn đang loại bỏ vĩnh viễn nỗi lo về chứng chỉ hết hạn, cắt bỏ hàng chục dòng cấu hình phức tạp và tích hợp những giao thức hiện đại nhất như HTTP/3 chỉ với vài thao tác gõ phím. Caddy chứng minh rằng quản lý hạ tầng mạng không cần phải là một công việc đầy rủi ro và phức tạp.
Nếu bạn đang chuẩn bị cho đợt deploy dự án mới, dựng homelab, hay cần tái cấu trúc lại hệ thống VPS của công ty, hãy thử nghiệm Caddy. Đừng ngần ngại tạo một file docker-compose.yml và để Caddy làm nốt phần việc dọn dẹp routing cho bạn.
Tài liệu tham khảo
- Automatic HTTPS – Caddy Documentation
- Reverse proxy quick-start – Caddy Documentation
- GitHub – caddyserver/certmagic: Automatic HTTPS for any Go program: fully-managed TLS certificate issuance and renewal · GitHub
- RFC 8737: Automated Certificate Management Environment (ACME) TLS Application Layer Protocol Negotiation (ALPN) Challenge Extension






