Сервер Vertx устанавливает требование взаимной аутентификации для каждого маршрута
У меня есть HTTP-сервер на базе Vertx (3.9.x), на котором мне нужно обслуживать два набора путей запроса. Первый путь всегда ожидает клиентских сертификатов (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? Если да, то как?
Есть ли альтернатива при прослушивании на одном порту?
Благодарю.
1 ответ
После еще нескольких исследований я пришел к тому, что предлагается в этом посте. Короче говоря, "Я не могу изменять конфигурацию SSL в зависимости от пути URL-адреса, поскольку он доступен только после того, как соединение SSL было установлено".
Решение состоит в том, что в начале у меня может быть другой обработчик для путей, для которых требуется сертификат клиента (взаимная проверка подлинности), и проверять сертификат клиента там, как показано ниже:
router.route("/required-client-cert/")
.handler(clientCertHandler::validateClientCert)
.handler(this::handleMutualAuth);
PS: Другой подход - настроить другой порт для прослушивания запросов, требующих взаимной аутентификации. Однако в моем случае настройка другого порта невозможна.