ALB擴充版支援JWT入站身份認證,在請求轉寄至後端大模型服務前驗證Token有效性,拒絕未授權訪問,保護AI服務安全。
方案架構
擴充版ALB執行個體接收用戶端請求,轉寄規則根據HTTP標題匹配請求。JWT認證組件通過服務擴充關聯轉寄規則,在轉寄動作前執行:從HTTP要求標頭中提取JWT Token,使用從遠程JWKS伺服器擷取的公開金鑰對Token進行驗證,驗證通過時允許請求轉寄至後端AI服務;驗證失敗或請求未提供JWT Token時直接返回401響應,阻止請求繼續轉寄。
-
擴充版ALB執行個體:提供負載平衡和流量轉寄能力。
-
AI類型伺服器組:對接後端大模型服務。
-
HTTPS監聽:接收用戶端請求。
-
轉寄規則:根據HTTP標題條件匹配請求並轉寄。
-
服務擴充:通過JWT認證組件實現入站身份認證和轉寄控制。
-
JWKS伺服器:本文樣本使用Nginx類比,提供公開金鑰資訊。
適用範圍
-
使用者已擷取ALB擴充版公測資格。
-
使用者已在華北6(烏蘭察布)地區建立一個Virtual Private Cloud,分別在可用性區域A和可用性區域B建立交換器VSW1和VSW2,且交換器已開通公網SNAT(用於AI伺服器組調用公網大模型)。
-
使用者已在VSW1或VSW2建立一台ECS(Alibaba Cloud Linux 3.2104系統),且ECS所在安全性群組已放通VSW1和VSW2的網段IP。
-
使用者已準備好與自訂網域名匹配的伺服器憑證。非阿里雲購買的認證需要上傳到阿里雲認證服務。
操作步驟
1.建立擴充版ALB執行個體
-
登入ALB控制台,選擇華北6(烏蘭察布)地區,單擊建立應用型負載平衡。
-
在購買頁完成以下配置,單擊立即建立。
-
地區:選擇華北6(烏蘭察布)。
-
執行個體網路類型:選擇公網。
-
VPC和可用性區域:選擇目標VPC,勾選烏蘭察布 可用性區域A和烏蘭察布 可用性區域B後選擇對應交換器,並自動分配公網IP。
-
協議版本:選擇IPv4。
-
功能版本(執行個體費):選擇擴充版。
-
-
在確認訂單頁面確認執行個體配置詳情,單擊立即開通。
2.建立AI類型伺服器組
建立AI類型伺服器組,對接阿里雲百鍊。
-
在伺服器組控制台,單擊建立伺服器組,伺服器群組類型選擇AI服務,輸入名稱如
sgp-ai-qwen,單擊建立。 -
在伺服器組建立成功對話方塊單擊添加後端伺服器。
-
在添加AI服務對話方塊完成配置,單擊確定。
-
大模型供應商:選擇阿里雲百鍊。
-
服務地址:選擇大模型供應商後自動填滿。
-
身份憑證:選擇為阿里雲百鍊API Key建立的身份憑證。
-
3.建立監聽
-
在ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。在監聽頁簽單擊建立監聽。
-
在配置監聽步驟,選擇監聽協議為HTTPS,監聽連接埠填寫
443,完成後單擊下一步。 -
在配置SSL認證步驟,選擇與自訂網域名匹配的伺服器憑證,單擊下一步。
-
在選擇伺服器組步驟,依次選擇AI服務類型和伺服器組
sgp-ai-qwen,完成後單擊下一步。此處選擇的伺服器組將用於監聽的預設規則,即在請求未命中其他轉寄規則時處理請求,使用者可根據實際需求進行調整。
-
在組態稽核步驟,確認配置並單擊提交。
4.部署JWKS伺服器
在ECS上部署Nginx,類比JWKS伺服器提供JWT公開金鑰資訊。需確保ALB能夠通過VPC內網訪問到JWKS伺服器。
4.1 產生JWT金鑰組和Token
使用Python指令碼產生符合規範的公開金鑰JSON檔案,以及一個用於測試的JWT Token。
-
登入ECS執行個體,安裝必要的Python依賴庫。Alibaba Cloud Linux 預設已安裝Python3,需匯集安裝
jwcrypto庫:sudo pip3 install --upgrade pip sudo pip3 install jwcrypto -
建立產生指令碼
generate_jwt_jwks.py。sudo vim generate_jwt_jwks.py將以下代碼複製到檔案中:
import json import time import sys # 檢查依賴庫 try: from jwcrypto import jwk, jwt except ImportError: print("Error: Library 'jwcrypto' is not installed.") print("Please run: pip3 install jwcrypto") sys.exit(1) def main(): print(">>> 開始產生 JWKS 和 JWT...\n") # --- 配置資訊 --- KEY_ID = "aliyun-test-kid" # 密鑰ID ISSUER = "http://your-nginx-server-ip" # 建議修改為實際 Nginx IP 或網域名稱,也可保持預設 SUBJECT = "test-user-001" # 測試使用者標識 # --- 1. 產生 RSA 金鑰組 (2048位) --- # 使用 RS256 演算法產生密鑰 key = jwk.JWK.generate(kty='RSA', size=2048, alg='RS256', use='sig', kid=KEY_ID) # --- 2. 匯出公開金鑰並儲存為 jwks.json --- # Nginx 需要讀取這個檔案來驗證 Token public_key = key.export_public(as_dict=True) jwks_data = { "keys": [public_key] } jwks_filename = "jwks.json" with open(jwks_filename, "w") as f: json.dump(jwks_data, f, indent=4) print(f"[成功] JWKS 檔案已建立: ./{jwks_filename}") print(f" 後續步驟: 請將此檔案移動到 Nginx 目錄下。") # --- 3. 產生簽名 JWT (使用私密金鑰) --- claims = { "sub": SUBJECT, "iss": ISSUER, "name": "Aliyun Doc User", "role": "admin", "iat": int(time.time()), # 有效期間設為 100 年,避免測試期間 Token 到期 "exp": int(time.time()) + 3600 * 24 * 365 * 100 } # 建立並簽名 Token token = jwt.JWT( header={"alg": "RS256", "kid": KEY_ID, "typ": "JWT"}, claims=claims ) token.make_signed_token(key) print("\n[成功] 測試 JWT 已產生 (有效期間 100 年):") print("-" * 60) print(token.serialize()) print("-" * 60) print("操作: 請使用此 Token 進行 API 請求測試。") if __name__ == "__main__": main() -
運行指令碼組建檔案:
sudo python3 generate_jwt_jwks.py請注意記錄指令碼輸出中產生的 Token 字串(即
eyJ...開頭的長字串),後續將在驗證環節使用。
4.2 安裝和配置Nginx
在ECS執行個體上安裝Nginx,並配置託管上一步產生的 jwks.json 檔案。
-
安裝Nginx:
sudo yum install -y nginx sudo systemctl start nginx sudo systemctl enable nginx -
準備存放目錄並將產生的公開金鑰JSON檔案移動到該目錄:
# 建立存放目錄 sudo mkdir -p /usr/share/nginx/html/auth # 移動 jwks.json 檔案 sudo cp jwks.json /usr/share/nginx/html/auth/jwks.json # 賦予讀取許可權 sudo chmod 644 /usr/share/nginx/html/auth/jwks.json -
在
/etc/nginx/default.d/目錄下建立設定檔jwks.conf:sudo vim /etc/nginx/default.d/jwks.conf填入以下配置:
location /auth/v1 { # 禁用緩衝,確保用戶端總是擷取最新的公開金鑰配置 add_header Cache-Control "no-store, no-cache, must-revalidate"; # 設定正確的響應類型 default_type application/json; # 使用 alias 直接指向檔案 alias /usr/share/nginx/html/auth/jwks.json; } -
驗證Nginx配置並重新載入:
sudo nginx -t sudo systemctl reload nginx -
測試JWKS伺服器是否正常返回:
curl http://localhost:port/auth/v1應返回包含
RSA演算法(alg: RS256)公開金鑰資訊的 JSON 資料,證明 JWKS 服務部署成功。 -
記錄ECS執行個體的私網IP地址,後續用於佈建服務擴充。
5.建立服務擴充
建立服務擴充並添加JWT認證組件,配置遠程JWKS伺服器位址和JWT Token提取方式。
-
在服務擴充控制台,單擊建立服務擴充。在服務擴充配置地區,輸入服務副檔名稱如
jwt-auth-extension。 -
擴充類型預設選擇外掛程式,組件名稱下拉選擇JWT認證。完成以下配置,單擊建立。
-
遠程服務:填寫JWKS伺服器位址,格式為
http://<ECS私網IP>:<連接埠>/auth/v1。例如http://172.16.11.132:80/auth/v1。 -
緩存時間:JWKS公開金鑰緩衝時間,使用預設值300秒。
-
JWKS Token配置:
-
類型:選擇按HTTP標題。
-
Key:使用預設值
Authorization。 -
Value首碼:使用預設值
Bearer。
-
-
逾時時間(毫秒)和處理策略:保持預設值
1000和終止,使用者可按需調整。
-
6.配置轉寄規則
在監聽上建立轉寄規則,添加HTTP標題條件並關聯服務擴充。
-
在ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。切換到監聽頁簽後,單擊目標監聽ID進入監聽詳情頁,再切換到轉寄規則頁簽。
-
單擊插入新規則,完成以下配置後單擊確定。
-
轉寄條件:選擇HTTP標題,鍵是
k,值是v。k: v僅作樣本,用於生產時使用者可按需配置HTTP標題索引值對,或使用其他類型的轉寄條件。 -
服務擴充(可選):預設使用已有服務擴充,下拉選擇
jwt-auth-extension。 -
轉寄動作:選擇轉寄至AI服務伺服器組
sgp-ai-qwen。
-
轉寄規則建立後,包含HTTP標題k: v的請求會命中該規則,服務擴充從HTTP要求標頭Authorization中提取JWT Token,並從遠程JWKS伺服器擷取公開金鑰進行驗證,驗證通過後轉寄至伺服器組sgp-ai-qwen。
7.設定網域名稱解析
將自有網域名稱通過CNAME解析指向ALB執行個體的DNS名稱,用戶端通過自有網域名稱訪問ALB。
本文以阿里雲Alibaba Cloud DNS為例,對於非阿里雲註冊網域名稱,需先將網域名稱添加到雲解析控制台。
8.驗證測試
使用curl命令發送請求驗證JWT認證功能,請求需滿足以下條件:
-
包含轉寄規則匹配標題
k: v:用於匹配關聯了服務擴充的轉寄規則。 -
符合OpenAI相容協議:請求路徑為
/v1/completions、/v1/chat/completions或/v1/embeddings且整體格式符合規範。
以下測試命令中的網域名稱ai.example.com為樣本網域名稱,實際測試時請替換為步驟七中配置的真實網域名稱,需確保網域名稱解析已生效。
請求攜帶正確的JWT Token
即請求包含Authorization: Bearer <token>頭欄位,其中<token>為步驟4.1中產生的JWT Token。
# 將下方的 <Token字串> 替換為步驟 4.1 指令碼輸出的實際內容
token="<Token字串>"
curl -v \
-H "k: v" \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "你是誰"
}
]
}' \
https://ai.example.com/v1/chat/completions
請求成功時,返回HTTP 200狀態代碼和AI服務響應:
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "我是千問,是阿里巴巴集團旗下的通義實驗室自主研發的超大規模語言模型。我能夠回答問題、創作文字、邏輯推理、編程等多種任務。你可以問我任何問題,我會盡我所能提供協助。",
"role": "assistant"
}
}
],
"created": 1767613123,
"id": "chatcmpl-01fb9300-df1d-98d1-9f5d-874fddebf13f",
"model": "qwen-turbo",
"object": "chat.completion",
"usage": {
"completion_tokens": 47,
"prompt_tokens": 14,
"prompt_tokens_details": {
"cached_tokens": 0
},
"total_tokens": 61
}
}
請求攜帶錯誤的JWT Token或請求不攜帶JWT Token
請求攜帶錯誤的JWT Token
即請求包含Authorization: Bearer <token>頭欄位,但其中<token>非正確的JWT Token。
token="wrong-jwt-token"
curl -v \
-H "k: v" \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "你是誰"
}
]
}' \
https://ai.example.com/v1/chat/completions
請求失敗時,返回HTTP 401狀態代碼,響應體包含認證失敗原因。
HTTP回應標頭:
HTTP/2 401
www-authenticate: Bearer realm="https://ai.example.com/v1/chat/completions", error="invalid_token"
content-length: 79
content-type: text/plain
vary: Accept-Encoding
date: Wed, 21 Jan 2026 06:57:46 GMT
HTTP響應體(樣本):
Jwt verification fails
請求不攜帶JWT Token
即請求不包含Authorization: Bearer <token>頭欄位。
curl -v \
-H "k: v" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-turbo",
"messages": [
{
"role": "user",
"content": "你是誰"
}
]
}' \
https://ai.example.com/v1/chat/completions
請求失敗時,返回HTTP 401狀態代碼,響應體提示找不到JWT Token。
HTTP回應標頭:
HTTP/2 401
www-authenticate: Bearer realm="https://ai.example.com/v1/chat/completions"
content-length: 14
content-type: text/plain
date: Wed, 21 Jan 2026 07:00:10 GMT
HTTP響應體:
Jwt is missing
更多資訊
計費說明
ALB擴充版支援的地區
|
地區 |
地區 |
可用性區域 |
|
中國 |
華北6(烏蘭察布) |
可用性區域A、可用性區域B、可用性區域C |
|
華東1(杭州) |
可用性區域J、可用性區域K |
|
|
華北2(北京) |
可用性區域I、可用性區域K、可用性區域L |
|
|
華東2(上海) |
可用性區域B、可用性區域F |
|
|
中國香港 |
可用性區域B、可用性區域C、可用性區域D |
|
|
亞太地區 |
新加坡 |
可用性區域A、可用性區域B、可用性區域C |
|
日本(東京) |
可用性區域B、可用性區域C、可用性區域E |
|
|
馬來西亞(吉隆坡) |
可用性區域A、可用性區域B、可用性區域C |
|
|
歐美地區 |
德國(法蘭克福) |
可用性區域A、可用性區域B |
|
美國(矽谷) |
可用性區域A、可用性區域B |
|
|
中東 |
阿聯酋(杜拜) |
可用性區域A、可用性區域B |
使用建議
-
認證方案升級:本文採用Nginx類比JWKS伺服器,並以固定token進行認證。實際生產中建議部署標準身份認證服務(IdP)提供標準的 JWKS 介面,統一接管密鑰輪轉與 Token 簽發,實現更高的安全性。
-
高可用部署:認證服務應採用多可用性區域或叢集部署,避免因單點故障導致全鏈路鑒權失敗或業務中斷。
常見問題
JWT認證失敗,返回Jwks remote fetch is failed
說明ALB無法從遠程JWKS伺服器擷取公開金鑰用於認證。可遵循以下思路進行排查:
-
確認服務擴充中配置的遠程服務URL正確,且使用ECS執行個體的私網IP地址。
-
確認ALB執行個體與ECS執行個體在同一VPC內,網路互連。
-
確認ECS執行個體所在安全性群組及其系統防火牆已允許存取VSW1、VSW2網段對Nginx服務連接埠的訪問。
-
確認JWKS伺服器正常運行,可通過
curl命令在ECS執行個體本地進行測試。
已配置JWT認證,請求不帶token卻可以成功
-
確認轉寄條件與實際請求匹配且轉寄規則具備足夠高的優先順序,確保需要進行認證的請求能命中轉寄規則。
-
確認服務擴充正確添加了JWT認證組件且已關聯轉寄規則。