客户端证书认证
进入应用 SSL
页面,点击编辑证书。
这里选择 Yes
或者 Optional
启用客户端认证。
- Yes:强制客户端认证,如果没有客户端证书或者客户端证书错误会直接返回 400 错误码。
- Optional:可选客户端认证,如果没有客户端证书或者客户端证书错误也不会返回 400 错误码,需要在页面规则中使用
Enable SSL Client Verify
动作进行认证。
如果客户端证书是自签证书,则需要上传签发该证书的 CA 证书。
页面规则中进行客户端认证
需要确保客户端认证的选项为
Optional
。
在页面规则中可以根据不同条件灵活地启用客户端认证,比如判断 URI 前缀为 /client-verify
时,才启用客户端认证。
我们也提供了客户端证书中 Client Serial Number
, Subject DN
和 Issuer DN
作为条件,可以区分不同的客户端证书。
Serial Number
Subject DN
和 Issuer 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");