User Tools

Site Tools


Sidebar

Me
Здравствуйте!

Меня зовут Михаил Усик!
Я системный администратор
и наполняю эту wiki,
решая разнообразные IT-задачки.

Я всегда готов помочь Вам
наладить IT-инфраструктуру
за скромное вознаграждение!!

mike@autosys.tk
+7 (977) 887-96-23

linux_faq:keycloak_on_kubernetes_import_root_ca_ldaps

Проблема

Мне нужно сконфигурировать keycloak (версии 7.0.1), развернутый с помощью helm в кластере kubernetes, чтобы он забирал пользователей из Active Directory по протоколу LDAPS.
Проверка подключения к контроллеру домена (Test Connection) по протоколу ldaps (порт 636) проходит нормально, но тест аутентификации (Test Authentication) не проходит с ошибкой:

14:19:35,523 ERROR [org.keycloak.services] (default task-1) KC-SERVICES0055: Error when authenticating to LDAP: simple bind failed: dc.domain.local:636: javax.naming.CommunicationException: simple bind failed: dc.domain.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

Проблема в том, что сертификат контроллера домена выдан корпоративным certification authority.
Мануалы, которые я нашел в интернете предлагают пересобрать docker image, поместив туда корневой сертификат. Но мне такой вариант не нравится. Я бы хотел, чтобы при старте pod'а keycloak забирал текущий корневой сертификат с http-сервера и использовател его.

Решение

  • Добавить в состав JAVA_OPTS pod'а опции javax.net.ssl.trustStore и javax.net.ssl.trustStorePassword
  • При старте pod'а забирать сертификат и класть его в keystore.

Для этого редактируем StatefulSet keycloak:

В раздел env добавляем такое:

spec:
  template:
    spec:
      containers:
        env:
        - name: JAVA_OPTS
          value: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m
            -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman
            -Djava.awt.headless=true  -Djavax.net.ssl.trustStore=/opt/jboss/keycloak/standalone/configuration/keystores/truststore.jks  
            -Djavax.net.ssl.trustStorePassword=changeit 
            --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED

А command приводим к такому виду:

spec:
  template:
    spec:
      containers:
      ...
        command:
        - /bin/bash
        - -c
        args:
        - mkdir -p /opt/jboss/keycloak/standalone/configuration/keystores/ 
          && curl -k https://http.server.local/domain_ca.cer -o /opt/jboss/keycloak/standalone/configuration/ca.cer 
          && keytool -import -noprompt -keystore /opt/jboss/keycloak/standalone/configuration/keystores/truststore.jks -file /opt/jboss/keycloak/standalone/configuration/ca.cer -storepass changeit -alias domain-local-CA 
          && /scripts/keycloak.sh

В результате - до старта сервера Keycloak корневой сертификат забирается с http-сервера и помещается в ssl.trustStore, параметры которого (путь и пароль) передаются в виде переменных среды Java.

Discussion

Enter your comment. Wiki syntax is allowed:
F M U Z S
 
linux_faq/keycloak_on_kubernetes_import_root_ca_ldaps.txt · Last modified: 2019/12/17 12:17 by admin