two-way SSL(双向SSL)能否实现异步校验?具体实现方案是什么
这个需求可以实现,核心是将原本双向SSL握手阶段的同步客户端证书校验,调整为连接建立后的业务层异步校验,具体实现方案如下:
实现核心逻辑
常规双向SSL会在握手阶段强制要求客户端上传证书并同步校验,校验失败直接中断握手。要实现你要的效果,只需要跳过握手阶段的客户端证书强制校验,先完成单向SSL握手建立连接,后续再异步完成客户端证书的校验流程,校验不通过直接主动断连即可。
具体操作步骤
- 第一步:调整服务端TLS配置,关闭握手阶段的客户端证书强制校验
- 如果你用Nginx做SSL接入,将原本双向认证配置中的
ssl_verify_client on;修改为ssl_verify_client optional;,该配置会允许客户端握手阶段不上传证书,优先完成单向SSL连接建立 - 如果你是自研服务端(比如用Java Netty、Go TLS、Node.js TLS模块开发),将TLS配置中的客户端认证模式从
RequireAndVerifyClientAuth(强制校验)调整为RequestClientAuth(主动请求但不强制校验)或NoClientAuth(不主动请求)即可
- 如果你用Nginx做SSL接入,将原本双向认证配置中的
- 第二步:连接建立后触发异步校验逻辑
- 如果客户端握手阶段已经主动上传了证书,你可以直接从TLS会话上下文里提取到客户端证书信息,丢到独立的异步线程池/协程中执行校验,校验规则和常规双向SSL一致:包含证书有效期校验、CA信任链校验、证书吊销状态校验、主体/域名匹配校验等
- 如果客户端握手阶段没有上传证书,你可以在业务层自定义一个证书索要指令,连接建立后主动发给客户端,要求客户端在约定超时时间内上传证书,收到后再执行异步校验
- 第三步:校验阶段不阻塞业务流程
异步校验全程跑在独立的调度资源里,当前连接的消息收发、ACK返回全部正常处理,不会被校验流程阻塞 - 第四步:异常场景断连处理
一旦异步校验判定客户端证书无效,或者客户端超过约定时间没有上传证书,直接调用底层TCP/TLS连接的关闭接口主动断连即可,后续客户端发的所有消息都会被直接拒绝
注意事项
如果校验窗口内会传输敏感业务数据,建议业务层先做临时权限兜底,避免证书异常的客户端在未完成校验的窗口期拿到敏感信息。
内容的提问来源于stack exchange,提问作者msl12
相关产品推荐
相关产品推荐

