Сервер 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: Другой подход - настроить другой порт для прослушивания запросов, требующих взаимной аутентификации. Однако в моем случае настройка другого порта невозможна.

Другие вопросы по тегам