客戶端證書認證

進入應用 SSL 頁面,點選編輯證書。

這裡選擇 Yes 或者 Optional 啟用客戶端認證。

  • Yes:強制客戶端認證,如果沒有客戶端證書或者客戶端證書錯誤會直接返回 400 錯誤碼。
  • Optional:可選客戶端認證,如果沒有客戶端證書或者客戶端證書錯誤也不會返回 400 錯誤碼,需要在頁面規則中使用 Enable SSL Client Verify 動作進行認證。

如果客戶端證書是自簽證書,則需要上傳簽發該證書的 CA 證書。

頁面規則中進行客戶端認證

需要確保客戶端認證的選項為 Optional

在頁面規則中可以根據不同條件靈活地啟用客戶端認證,比如判斷 URI 字首為 /client-verify 時,才啟用客戶端認證。

我們也提供了客戶端證書中 Client Serial Number, Subject DNIssuer DN 作為條件,可以區分不同的客戶端證書。

Serial Number Subject DNIssuer DN 可以透過 openssl 命令來讀取:

# serial number
openssl x509 -serial -nameopt RFC2253 -noout -in client.crt

# subject DN
openssl x509 -subject -nameopt RFC2253 -noout -in client.crt

# issuer DN
openssl x509 -issuer -nameopt RFC2253 -noout -in client.crt

如果我們想要自定義客戶端認證錯誤頁,可以在啟用客戶端認證前面新增自定義錯誤頁動作

使用全域性 Lua 模組進行客戶端證書序列號認證

如果需要檢查 CRL 證書撤消列表中被撤消的序列號,可以新增全域性 Lua 模組,然後透過 Edgelang 進行呼叫。 可以透過 Python SDK 來生成該全域性 Lua 模組進行動態更新。

import sys

from edge2client import Edge2Client

client = Edge2Client('https://your-admin-addr', 'your-admin-user', 'your-admin-password')

crl_files = ["~/test.crl"]
code = client. conv_crl_to_lua_module(crl_files)

client.login()

partition_id = 1
name = "crl_test.com"

# 首次建立模組
result = client.new_partition_lua_module(partition_id, name, code)
mod_id = result["id"]

# 後續更新模組,需要記住模組 ID
result = client.put_partition_lua_module(partition_id, mod_id, name, code)
print(result)

將上面的程式碼儲存為 serial-num.py, 然後執行命令 python3 serial-num.py。你可以在你的管理頁面看到類似新建立的全域性模組如下:

比如新增了一個名稱為 crl_test.com 的全域性 Lua 模組,那麼可以用下面的 Edgelang 來呼叫。

true =>
    foreign-call(module: "crl_test.com", func: "verify_client_serial");