客户端证书认证

进入应用 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', 'edge-admin', 'openresty@Admin2020')

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");