<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>54389</bug_id>
          
          <creation_ts>2025-05-20 17:12:20 +0300</creation_ts>
          <short_desc>SSH-ключ из OpenID (&lt;- Keycloak &lt;- FreeIPA) не загружается при регистрации учётной записи, только при повторном входе</short_desc>
          <delta_ts>2026-04-05 16:20:48 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>forgejo</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Artem Varaksa">varaksaaa</reporter>
          <assigned_to name="Alexey Shabalin">shaba</assigned_to>
          <cc>ivanovav</cc>
    
    <cc>maks1ms</cc>
    
    <cc>shaba</cc>
    
    <cc>sychkinsv</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>265229</commentid>
    <comment_count>0</comment_count>
    <who name="Artem Varaksa">varaksaaa</who>
    <bug_when>2025-05-20 17:12:20 +0300</bug_when>
    <thetext>Шаги
====

Настраиваются 3 сервера (FreeIPA, Keycloak, Forgejo).

1. FreeIPA

1.1. Развернуть FreeIPA сервер.

1.2. На сервере FreeIPA:
- Сгенерировать ssh-ключ:
  # ssh-keygen -t ed25519 -N &apos;&apos; -f ~/.ssh/ed25519 &amp;&amp; cat ~/.ssh/ed25519.pub
- Добавить выведенный публичный ssh ключ для пользователя (например) testuser в веб-интерфейсе FreeIPA &gt; Сохранить
- Инициализировать билет kerberos для testuser и заодно изменить пароль:
  # kinit testuser

2. Keycloak

2.1. # apt-get install -y postgresql-server keycloak

2.2. Настроить базу данных postgresql и создать пользователя:
# /etc/init.d/postgresql initdb
# systemctl enable --now postgresql &amp;&amp; sleep 5; systemctl status postgresql -l --no-pager
# psql -U postgres -c &quot;CREATE USER keycloak WITH PASSWORD &apos;12345678&apos;;&quot; &amp;&amp; \
    psql -U postgres -c &quot;CREATE DATABASE keycloak OWNER keycloak;&quot; &amp;&amp; \
    psql -U postgres -c &quot;GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;&quot;

2.3. Отключить сервис ahttpd (в случае, если установлен):
# systemctl stop ahttpd

2.4. Настроить конфигурационный файл:
# cp /etc/keycloak/keycloak.conf /etc/keycloak/keycloak.conf-orig &amp;&amp; sed -i -e &quot;s|#db=postgres|db=postgres|g&quot; \
    -e &quot;s|#db-username=keycloak|db-username=keycloak|g&quot; \
    -e &quot;s|#db-password=password|db-password=12345678|g&quot; \
    -e &quot;s|#db-url=jdbc:postgresql://localhost/keycloak|db-url=jdbc:postgresql://localhost/keycloak|g&quot; \
    -e &quot;s|#health-enabled=true|health-enabled=true|g&quot; \
    -e &quot;s|#metrics-enabled=true|metrics-enabled=true|g&quot; \
    -e &quot;s|#hostname=myhostname|hostname=$(hostname -i)|g&quot; \
    /etc/keycloak/keycloak.conf &amp;&amp; diff -u --color /etc/keycloak/keycloak.conf-orig /etc/keycloak/keycloak.conf

2.5. Создать файл san.cnf
# cat &lt;&lt; EOF &gt; san.cnf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = $(hostname -i)

[v3_req]
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:$(hostname -i)
EOF

2.6. Сгенерировать сертификаты и ключи:
# openssl req -x509 -newkey rsa:4096 -keyout /var/lib/ssl/private/keycloak.key -out /var/lib/ssl/certs/keycloak.crt -days 365 -nodes -config san.cnf

2.7. Изменить конфиг:
# sed -i -e &apos;s|https-certificate-file=/var/lib/ssl/certs/keycloak.pem|https-certificate-file=/var/lib/ssl/certs/keycloak.crt|&apos; -e &apos;s|https-certificate-key-file=/var/lib/ssl/private/keycloak.pem|https-certificate-key-file=/var/lib/ssl/private/keycloak.key|&apos; /etc/keycloak/keycloak.conf

2.8. Создать пользователя администратора:
# kc.sh bootstrap-admin user
- На запрос логина/пароля ввести: admin/admin

2.9. Запустить сервис keycloak:
# systemctl enable --now keycloak.service &amp;&amp; sleep 5; systemctl status keycloak.service -l --no-pager

2.10. Открыть в браузере страницу по полученной ссылке:
# echo &quot;https://$(hostname -i):8443&quot;

2.11. Авторизоваться созданным ранее пользователем admin
2.12. Создать новый realm &gt; Нажать Keycloak master &gt; Create Realm &gt; realm name: forgejo

2.13. Настроить LDAP:

- Добавить в /etc/hosts на сервере keycloak
# echo &apos;&lt;ipservfreeipa&gt; dc.freeipa.testdomain&apos; &gt;&gt; /etc/hosts

- В веб-интерфейсе keycloak перейти User federation &gt; Add LDAP provides. Заполнить данные:

UI display name: dc.freeipa.testdomain
Vendor: Red Hat Directory Server
Connection URL: ldap://dc.freeipa.testdomain
Bind type: simple
Bind DN: uid=admin,cn=users,cn=accounts,dc=freeipa,dc=testdomain
Bind credentials: &lt;FreeIPA admin password&gt;
Edit mode: Read_ONLY
Users DN: cn=users,cn=accounts,dc=freeipa,dc=testdomain
Username LDAP attribute: uid
RDN LDAP attribute: uid
UUID LDAP attribute: uid
User object classes: inetOrgPerson, organizationalPerson, person, top

- Нажать Save
- Перейти в созданного провайдера &gt; Action &gt; Sync all users
- Перейти во вкладку Users, в поиске ввести *, выполнить поиск
- Выбрать пользователя testuser &gt; Role mapping &gt; Assign role, добавить во все роли

2.14. Настроить Mappers на получение ssh ключей с сервера FreeIPA
- Перейти в User federation &gt; Перейти в созданный LDAP provides &gt; Mappers &gt; Add mapper

Name: SshPubKey
Mapper type: user-attribute-ldap-mapper
User Model Attribute: SshPubKey
LDAP Attribute: ipaSshPubKey
Always Read Value From LDAP:  ON

- Save
- Перейти в settings &gt; Action &gt; Sync all users

2.15. Создать Client

Clients &gt; Create client
     Client type :  «OpenID Connect»
     Client ID : forgejo
Далее
     Client authentication: On
Далее
     Valid redirect URIs: *
     Valid post logout redirect URIs: http://&lt;forgejo_ip&gt;:3000/*
     Web origins: http://&lt;forgejo_ip&gt;:3000/

- Сохранить
- Перейти во вкладку Credentials и скопировать себе Client Secret, нужен будет позже

2.16. Создать Client Scope

- Client Scope &gt; Create client scope

name: sshpubkey
Include in token scope: On

- Save

2.17. Перейти в созданный Client scope &gt; mappers &gt; Configure a new mapper &gt; User Attribute

name: sshpubkey
User Attribute: SshPubKey
Token Claim Name: sshpubkey
Активировать Multivalued

2.18. Назначить клиенту созданный Client scope

- Clients &gt; forgejo &gt; Client Scope &gt; Add client scope &gt; Выбрать созданный client scope sshpubkey &gt; Add &gt; Optional

3. Forgejo

# apt-get install -y forgejo &amp;&amp; \
    systemctl enable --now forgejo &amp;&amp; sleep 5 &amp;&amp; systemctl status forgejo --no-pager -l &amp;&amp; \
    echo &quot;http://$(hostname -i):3000&quot;

- Войти в веб-интерфейс Forgejo, указать:
Тип базы данных: SQLite3
Внизу страницы: Учётная запись администратора -&gt; Задать имя altadmin, пароль 12345678 и email test@example.org
Нажать Установить Forgejo

# sed -i &apos;s/DISABLE_REGISTRATION = true/DISABLE_REGISTRATION = false/&apos; /etc/forgejo/app.ini &amp;&amp; \
    scp root@&lt;keycloak_ip&gt;:/var/lib/ssl/certs/keycloak.crt ~/ &amp;&amp; \
    cat keycloak.crt | tee -a /usr/share/ca-certificates/ca-bundle.crt &amp;&amp; \
    systemctl restart forgejo

- Перейти в значок профиля &gt; Панель управления &gt; Идентификация и доступ &gt; Аутентификация &gt; Добавить новый источник

Тип аутентификации: OAuth2
Название аутентификации: Keycloak
Поставщик OAuth2: OpenID Connect
ID клиента (ключ): forgejo
Клиентский ключ: вставить раннее скопированный ключ с keycloak&apos;a
OpenID Connect URL для автоматизации входа: https://&lt;ip_keycloak&gt;:8443/realms/forgejo/.well-known/openid-configuration
Дополнительные разрешения: sshpubkey
Атрибут открытого ключа SSH: sshpubkey
Нажать Создать источник аутентификации

- Выйти из учетной записи администратора
- Вход &gt; Войти через Keycloak &gt; войти &gt; нажать Завершить регистрацию
- Перейти в Настройки &gt; Ключи SSH

Фактический результат
=====================

Ключа нет.

Ожидаемый результат
===================

Ключ должен появляться сразу.

Дополнительно
=============

Если выйти и войти заново пользователем, ключ появится.

Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[sisyphus] ALT Server 11.0 beta20250213 x86_64
[p11+381621] ALT Server 11.0 beta20250213 x86_64
forgejo-11.0.1-alt1.x86_64

[p11] ALT Server 11.0 beta20250213 x86_64
forgejo-10.0.1-alt2.x86_64

Сервера keycloak и freeipa: [p11 = p11+381621] ALT Server 11.0 beta20250213 x86_64
freeipa-server-4.12.3-alt2.x86_64
keycloak-26.2.0-alt1.x86_64</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281275</commentid>
    <comment_count>1</comment_count>
    <who name="Иванов Александр Владимирович">ivanovav</who>
    <bug_when>2026-02-02 16:36:12 +0300</bug_when>
    <thetext>Ошибка актуальна для версии keycloak-26.5.2-alt1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285164</commentid>
    <comment_count>2</comment_count>
    <who name="Сычкин Сергей Витальевич">sychkinsv</who>
    <bug_when>2026-04-05 16:20:48 +0300</bug_when>
    <thetext>Ошибка актуальна для версии keycloak-26.5.7-alt1</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>