Что касается подхода с использованием клиентских сертификатов, его будет не так уж сложно реализовать, но при этом разрешить доступ пользователям без клиентских сертификатов.
Если бы вы действительно создали собственный самозаверяющий центр сертификации и выдавали клиентские сертификаты для каждой клиентской службы, у вас был бы простой способ аутентификации этих служб.
В зависимости от того, какой веб-сервер вы используете, должен быть способ указания аутентификации клиента, который будет принимать сертификат клиента, но не требует его. Например, в Tomcat при указании коннектора https вы можете установить «clientAuth = want» вместо «true» или «false». Затем вы должны обязательно добавить свой самозаверяющий сертификат CA в хранилище доверенных сертификатов (по умолчанию файл cacerts в используемой вами JRE, если только вы не указали другой файл в конфигурации своего веб-сервера), поэтому единственными доверенными сертификатами будут те, которые были выданы из Ваша собственная подпись CA.
На стороне сервера вы разрешаете доступ к службам, которые хотите защитить, только если вы можете получить сертификат клиента из запроса (не ноль) и проходить любые проверки DN, если вы предпочитаете какой-либо дополнительный уровень безопасности. Для пользователей без клиентских сертификатов они все равно смогут получить доступ к вашим услугам, но в запросе просто не будет сертификатов.
На мой взгляд, это наиболее «безопасный» способ, но он, безусловно, имеет свою кривую обучения и накладные расходы, поэтому не обязательно может быть лучшим решением для ваших нужд.