全部產品
Search
文件中心

Server Load Balancer:JWT入站身份認證實踐

更新時間:Aug 12, 2026

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。

  • 使用者已開通阿里雲百鍊並擷取了API Key,且已將該API Key添加為身份管理中的身份憑證。

  • 使用者已註冊自訂網域名。本文計劃將ALB執行個體部署於華北6(烏蘭察布)地區,因此網域名稱需要完成ICP備案

  • 使用者已準備好與自訂網域名匹配的伺服器憑證。非阿里雲購買的認證需要上傳到阿里雲認證服務

操作步驟

1.建立擴充版ALB執行個體

  1. 登入ALB控制台,選擇華北6(烏蘭察布)地區單擊建立應用型負載平衡

  2. 在購買頁完成以下配置,單擊立即建立

    • 地區:選擇華北6(烏蘭察布)

    • 執行個體網路類型:選擇公網

    • VPC可用性區域:選擇目標VPC,勾選烏蘭察布 可用性區域A烏蘭察布 可用性區域B後選擇對應交換器,並自動分配公網IP

    • 協議版本:選擇IPv4

    • 功能版本(執行個體費):選擇擴充版

  3. 確認訂單頁面確認執行個體配置詳情,單擊立即開通

2.建立AI類型伺服器組

建立AI類型伺服器組,對接阿里雲百鍊。

  1. 伺服器組控制台,單擊建立伺服器組伺服器群組類型選擇AI服務,輸入名稱如sgp-ai-qwen,單擊建立

  2. 伺服器組建立成功對話方塊單擊添加後端伺服器

  3. 添加AI服務對話方塊完成配置,單擊確定

    • 大模型供應商:選擇阿里雲百鍊

    • 服務地址:選擇大模型供應商後自動填滿。

    • 身份憑證:選擇為阿里雲百鍊API Key建立的身份憑證。

3.建立監聽

  1. ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。在監聽頁簽單擊建立監聽

  2. 配置監聽步驟,選擇監聽協議HTTPS監聽連接埠填寫443,完成後單擊下一步

  3. 配置SSL認證步驟,選擇與自訂網域名匹配的伺服器憑證,單擊下一步

  4. 選擇伺服器組步驟,依次選擇AI服務類型和伺服器組sgp-ai-qwen,完成後單擊下一步

    此處選擇的伺服器組將用於監聽的預設規則,即在請求未命中其他轉寄規則時處理請求,使用者可根據實際需求進行調整。
  5. 組態稽核步驟,確認配置並單擊提交

4.部署JWKS伺服器

在ECS上部署Nginx,類比JWKS伺服器提供JWT公開金鑰資訊。需確保ALB能夠通過VPC內網訪問到JWKS伺服器。

4.1 產生JWT金鑰組和Token

使用Python指令碼產生符合規範的公開金鑰JSON檔案,以及一個用於測試的JWT Token。

  1. 登入ECS執行個體,安裝必要的Python依賴庫。Alibaba Cloud Linux 預設已安裝Python3,需匯集安裝 jwcrypto 庫:

    sudo pip3 install --upgrade pip
    sudo pip3 install jwcrypto
  2. 建立產生指令碼 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()
  3. 運行指令碼組建檔案:

    sudo python3 generate_jwt_jwks.py

    請注意記錄指令碼輸出中產生的 Token 字串(即 eyJ... 開頭的長字串),後續將在驗證環節使用。

4.2 安裝和配置Nginx

在ECS執行個體上安裝Nginx,並配置託管上一步產生的 jwks.json 檔案。

  1. 安裝Nginx:

    sudo yum install -y nginx
    sudo systemctl start nginx
    sudo systemctl enable nginx
  2. 準備存放目錄並將產生的公開金鑰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
  3. 在 /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;
    }
  4. 驗證Nginx配置並重新載入:

    sudo nginx -t
    sudo systemctl reload nginx
  5. 測試JWKS伺服器是否正常返回:

    curl http://localhost:port/auth/v1

    應返回包含 RSA 演算法(alg: RS256)公開金鑰資訊的 JSON 資料,證明 JWKS 服務部署成功。

  6. 記錄ECS執行個體的私網IP地址,後續用於佈建服務擴充。

5.建立服務擴充

建立服務擴充並添加JWT認證組件,配置遠程JWKS伺服器位址和JWT Token提取方式。

  1. 服務擴充控制台,單擊建立服務擴充。在服務擴充配置地區,輸入服務副檔名稱jwt-auth-extension

  2. 擴充類型預設選擇外掛程式組件名稱下拉選擇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標題條件並關聯服務擴充。

  1. ALB控制台,單擊目標執行個體ID進入執行個體詳情頁。切換到監聽頁簽後,單擊目標監聽ID進入監聽詳情頁,再切換到轉寄規則頁簽。

  2. 單擊插入新規則,完成以下配置後單擊確定

    • 轉寄條件:選擇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為例,對於非阿里雲註冊網域名稱,需先將網域名稱添加到雲解析控制台

  1. ALB控制台,複製目標執行個體的DNS 名稱

  2. 登入網域名稱解析控制台,在目標網域名稱的操作列單擊解析设置。在解析设置頁面單擊添加记录

  3. 參考以下資訊添加CNAME記錄,完成後單擊确定

    • 记录类型:選擇CNAME

    • 主机记录:輸入欄位名首碼如ai。假設使用者自有根網域名稱為example.com,則訪問ALB的網域名稱為ai.example.com

    • 解析请求来源TTL时间:使用預設值。

    • 记录值:輸入ALB執行個體的DNS名稱。

  4. 在彈出的解析变更确认對話方塊確認解析資訊,單擊確定

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擴充版:目前處於公測階段,使用者可免費體驗。

  • 公網訪問費用:公網NAT Gateway收取執行個體費和容量單位CU費。NAT Gateway和擴充版ALB執行個體綁定的EIP有獨立的計費規則,費用由EIP收取。

  • ECS執行個體:詳見ECS計費概述。若出於測試目的建立ECS,建議建立低規格的隨用隨付執行個體並及時釋放。

  • 網域名稱和DNS解析費用:除了需要支付網域名稱供應商的網域名稱費用外,在阿里雲配置DNS解析需要支付公網權威解析費用

  • 認證費用:從阿里雲購買認證或將認證上傳至阿里雲,需要支付伺服器憑證費用

  • 百鍊模型費用:調用百鍊大模型API需要支付費用。

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認證組件且已關聯轉寄規則。