Vertx 服务器设置每个路由的相互身份验证要求
Vertx Server Set Mutual Auth Requirement Per Route
我有一个基于 Vertx (3.9.x) 的 HTTP 服务器,我需要在其中满足两组请求路径。第一条路径始终需要客户端证书 (ClientAuth.REQUIRED
),而另一条路径的客户端证书是可选的(ClientAuth.REQUEST
或 ClientAuth.NONE
)。
正如我所看到的,唯一可以设置ClientAuth
的地方是HttpServerOptions
,它绑定到一个特定的端口,示例代码片段如下:
final HttpServerOptions options = new HttpServerOptions()
.setPort(443)
.setClientAuth(ClientAuth.REQUIRED) // One option per listening port.
// Set all other server options
路由器配置如下所示:
final Router router = Router.router(vertx);
router.route("/required-client-cert/").handler(this::handleMutualAuth);
router.route("/no-need-client-cert/").handler(this::handleRegularAuth);
// Any one of the above routes can work anytime, because ClientAuth is configured in server options.
是否可以在单个 Vertx 应用程序中处理此问题?如果是,怎么做?
在单端口监听时有没有其他选择?
谢谢。
经过更多研究,我最终得到了 中的建议。简而言之,“我无法根据 URL 的路径更改 SSL 配置,因为它仅在建立 SSL 连接后才可用”。
解决方案是,我可以在开头为需要客户端证书(相互身份验证)的路径设置另一个处理程序,并在那里验证客户端证书,如下所示:
router.route("/required-client-cert/")
.handler(clientCertHandler::validateClientCert)
.handler(this::handleMutualAuth);
PS:另一种方法是配置不同的端口来监听需要相互认证的请求。但是,在我的情况下,配置另一个端口不是一个选项。
我有一个基于 Vertx (3.9.x) 的 HTTP 服务器,我需要在其中满足两组请求路径。第一条路径始终需要客户端证书 (ClientAuth.REQUIRED
),而另一条路径的客户端证书是可选的(ClientAuth.REQUEST
或 ClientAuth.NONE
)。
正如我所看到的,唯一可以设置ClientAuth
的地方是HttpServerOptions
,它绑定到一个特定的端口,示例代码片段如下:
final HttpServerOptions options = new HttpServerOptions()
.setPort(443)
.setClientAuth(ClientAuth.REQUIRED) // One option per listening port.
// Set all other server options
路由器配置如下所示:
final Router router = Router.router(vertx);
router.route("/required-client-cert/").handler(this::handleMutualAuth);
router.route("/no-need-client-cert/").handler(this::handleRegularAuth);
// Any one of the above routes can work anytime, because ClientAuth is configured in server options.
是否可以在单个 Vertx 应用程序中处理此问题?如果是,怎么做?
在单端口监听时有没有其他选择?
谢谢。
经过更多研究,我最终得到了
解决方案是,我可以在开头为需要客户端证书(相互身份验证)的路径设置另一个处理程序,并在那里验证客户端证书,如下所示:
router.route("/required-client-cert/")
.handler(clientCertHandler::validateClientCert)
.handler(this::handleMutualAuth);
PS:另一种方法是配置不同的端口来监听需要相互认证的请求。但是,在我的情况下,配置另一个端口不是一个选项。