3. 基于设备证书的设备身份注册
设备身份注册的核心链路
设备身份注册的本质是给每台终端签发一张由内部 CA 背书的 X.509 设备证书,并把证书中的唯一标识(CN 或 SAN)写入零信任控制平面的设备清单。之后终端每次访问受保护资源时,零信任网关会校验设备证书链、有效期与吊销状态,只有通过校验的设备才被允许进入策略评估阶段。
签发设备证书
使用内部 CA 为终端签发证书,证书的 CN 或 SAN 必须包含设备的唯一标识。以下命令在终端上生成密钥对并提交 CSR:
# 1. 生成设备私钥(ECC P-256,推荐)
openssl ecparam -genkey -name prime256v1 -out device-01.key
# 2. 生成 CSR,CN 使用设备唯一标识
openssl req -new -key device-01.key -out device-01.csr \
-subj "/C=CN/O=Corp/OU=Devices/CN=device-01.corp.local"
# 3. 由内部 CA 签发证书(有效期 365 天)
openssl x509 -req -in device-01.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out device-01.crt -days 365 -sha256
# 4. 验证证书链
openssl verify -CAfile ca.crt device-01.crt
# 预期输出:device-01.crt: OK
注册到零信任设备清单
将证书指纹与设备标识注册到控制平面。以 API 方式注册为例:
# 提取证书 SHA-256 指纹
FINGERPRINT=$(openssl x509 -in device-01.crt -noout -fingerprint -sha256 \
| cut -d'=' -f2 | tr -d ':')
# 调用控制平面 API 注册设备
curl -X POST https://ztna.corp.local/api/v1/devices \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"device_id": "device-01",
"hostname": "device-01.corp.local",
"cert_fingerprint_sha256": "'"$FINGERPRINT"'",
"cert_cn": "device-01.corp.local",
"status": "active"
}'
注册时务必绑定证书指纹而非仅绑定 CN。仅绑定 CN 时,攻击者可用自签证书伪造相同 CN 绕过校验;绑定指纹后,网关会比对终端实际出示证书的 SHA-256 指纹与清单记录是否一致。
验证访问控制效果
注册完成后,用持有有效证书的终端和无效证书的终端分别发起访问,观察网关返回结果:
# 有效证书访问(预期 200)
curl --cert device-01.crt --key device-01.key \
https://ztna.corp.local/api/v1/data -v
# 无证书访问(预期 403)
curl https://ztna.corp.local/api/v1/data -v
# 使用自签证书访问(预期 403)
curl --cert fake.crt --key fake.key \
https://ztna.corp.local/api/v1/data -v
| 测试场景 | 终端证书状态 | 网关校验结果 | 预期 HTTP 状态 |
|---|---|---|---|
| 已注册设备 + 有效证书 | 证书链完整、未吊销 | 指纹匹配清单 | 200 |
| 未注册设备 + 有效证书 | 证书链完整但不在清单 | 指纹未匹配 | 403 |
| 已注册设备 + 已吊销证书 | CRL/OCSP 返回吊销 | 吊销检查失败 | 403 |
| 无证书访问 | 未提供客户端证书 | TLS 握手阶段拒绝 | 403 |
证书吊销后需确保网关能及时获取 CRL 或 OCSP 响应。若网关缓存 CRL 时间过长,已吊销设备仍可能在缓存有效期内通过校验。建议 CRL 缓存不超过 5 分钟,或启用 OCSP Stapling 实时校验。