У меня Apache httpd настроен как обратный прокси с SSL. Я пытаюсь настроить keycloak и гуакамоле, используя http за прокси. Я использую контейнеры keycloak, mysql, guacd и guacamole. У меня работает весь поток, пока keycloak не попытается перенаправить обратно на страницу гуакамоле. К вашему сведению... моя конфигурация очень похожа на следующий вопрос, но с другой ошибкой доступа, показанной ниже: Как настроить Keycloak для работы с плагином OpenID от Guacamole?
Итак, пользователь попадает на веб-сервер через: https://example.com/guacamole/. Httpd перенаправляет на http://guacamole:8080/guacamole. Guacamole перенаправляет на keycloak для аутентификации. Войдите в систему как действительный пользователь, и перенаправление на гуакамоле не удастся.
Мой гуакамоле настроен как:
openid-jwks-endpoint: https://example.com/auth/realms/Guacamole-test/protocol/openid-connect/certs
openid-issuer: https://example.com/auth/realms/Guacamole-test
openid-client-id: Guacamole
openid-redirect-uri: https://example.com/guacamole/
Моя конфигурация httpd:
ServerName example.com
SSLEngine On
SSLCertificateFile /opt/test.crt
SSLCertificateKeyFile /opt/test.key
ProxyPass /guacamole/ http://guacamole:8080/guacamole/ flushpackets=on
ProxyPassReverse /guacamole/ http://guacamole:8080/guacamole/
ProxyPass /guacamole/websocket-tunnel ws://guacamole:8080/guacamole/websocket-tunnel
ProxyPassReverse /guacamole/websocket-tunnel ws://guacamole:8080/guacamole/websocket-tunnel
ProxyPass /auth/ http://keycloak:8080/auth/
ProxyPassReverse /auth/ http://keycloak:8080/auth/
</VirtualHost>
Я получаю следующую ошибку в гуакамоле:
INFO o.a.g.a.o.t.TokenValidationService - Rejected invalid OpenID token: Unable to process JOSE object (cause: org.jose4j.lang.UnresolvableKeyException: Unable to find a suitable verification key for JWS w/ header {"alg":"RS256","typ" : "JWT","kid" : "bSv9K9W2us7SaUamJP3bWD1HWJuo6hbne2t3Gsc6V44"} due to an unexpected exception (javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target) while obtaining or using keys from JWKS endpoint at https://example.com/auth/realms/ocprealm/protocol/openid-connect/certs): JsonWebSignature{"alg":"RS256","typ" : "JWT","kid" : "bSv9K9W2us7SaUamJP3bWD1HWJuo6hbne2t3Gsc6V44"}->eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiU3Y5SzlXMnVzN1NhVWFtSlAzYldEMUhXSnVvNmhibmUydDNHc2M2VjQ0In0.eyJleHAiOjE2MDc5MDE3NDAsImlhdCI6MTYwNzkwMDg0MCwiYXV0aF90aW1lIjoxNjA3OTAwODI1LCJqdGkiOiJhYmI1MDY5Zi01MTYzLTQ2ZjUtODA2ZC05M2ZkODU2YmQxMzciLCJpc3MiOiJodHRwczovL3Vzd2Rzcy5wcm9nZW55Lm5ldC9hdXRoL3JlYWxtcy9vY3ByZWFsbSIsImF1ZCI6Ikd1YWNhbW9sZSIsInN1YiI6IjE4MDRjOWJiLTZiOTEtNDY0YS04N2I1LWQ4MDNiY2Y3YWZmNCIsInR5cCI6IklEIiwiYXpwIjoiR3VhY2Ftb2xlIiwibm9uY2UiOiJoazc5NmlmZHUwdmdvcjJxcnZidDNqZmowcCIsInNlc3Npb25fc3RhdGUiOiJiZWNjZTZmOS01MDQ2LTQzMWEtOTQzNy1hMDczYTRhNDZhNGIiLCJhY3IiOiIwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJuYW1lIjoiR3V5IFNoZXBoZXJkIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZ3NoZXBoZXJkIiwiZ2l2ZW5fbmFtZSI6Ikd1eSIsImZhbWlseV9uYW1lIjoiU2hlcGhlcmQiLCJlbWFpbCI6ImdzaGVwaGVyZEBwcm9nZW55Lm5ldCJ9.Fm2Vfep4N611KwSJc6MvhH80C3wca_T2If1YSVhzZdeC2eVh-v0_OCnEshcl_huta4a2VqolraqmqMDaxalAdnHO4jes71a2ndDfwoCnp1B06EBPL8kNnQeIHNM3fYps2GuhBqWLmfDDSIvXPlcnctrPKop8PQDglHSsiJOGgWgzfrQbG1zFlw0jupJVaYGY6P8q3Lji5ryIcStNATcuf1dCvF_v1oqoacYsRNFljyg7Xf0ZQIuA53xY3czKkiVVqZt55LArjAv1cPmrekkf77NlGpFzPbyw29_yItAy1rPqxfYphYDCm55qM97agjIE7WsKKC5lHwZ6gCWoMIcrMw
Я не понимаю, почему он пытается использовать проверку SSL при окончательном перенаправлении. Я считаю, что после того, как keycloak проверит логин и попытается перенаправить обратно на https://example.com/guacamole/, конфигурация httpd должна проксировать это на http://guacamole:8080/guacamole. Я также пытался настроить keycloak с помощью tls.key и tls.crt в соответствии с документацией по keycloak, чтобы увидеть, имеет ли это какое-либо значение, но это не так. Любая помощь будет принята с благодарностью, так как я явно упускаю или не понимаю что-то в конфигурации.
Гуакамоле по умолчанию регистрирует только сообщения на уровне «информация» или выше. Вы можете настроить гуакамоле для регистрации сообщения «отладка» для поиска дополнительной информации. Для этого требуется logback.xml
размещение файла в GUACAMOLE_HOME
. Подробности можно найти здесь: guacamole.apache.org/doc/1.2.0/gug/…
Вы забыли указать значение для openid-authorization-endpoint
в файле конфигурации гуакамоле? кажется, что это требуется в расширении openid
. Ссылка: guacamole.apache.org/doc/gug/openid-auth.html
Вы используете OIDC, поэтому, когда Guacamole получает ключ JWT, он пытается проверить подпись токена. Для этого он должен связаться с Keycloak (через https), чтобы получить открытый ключ, используемый для подписи токена. Это терпит неудачу с ошибкой рукопожатия SSL. Вероятно, JVM для гуакамоле не доверяет сертификату SSL, поэтому вам необходимо импортировать его в хранилище ключей JVM.
Я не думаю, что это связано с вашей проблемой, но при таком запуске Keycloak за прокси-сервером вам необходимо установить некоторые атрибуты. Я запускаю Keycloak в Docker, а вы делаете это с переменными среды. Эти два довольно важны для установки:
KEYCLOAK_FRONTEND_URL = "https://hostname/auth/"
PROXY_ADDRESS_FORWARDING = "true"
Если вы не используете версию Docker, вы можете довольно легко перевести, как эти значения передаются в Keycloak, когда он запускается здесь: https://github.com/keycloak/keycloak-containers/blob/11.0.3/server/tools. /docker-entrypoint.sh
Спасибо. Я посмотрю на импорт ключа в контейнере гуакамоле. Некоторое время отсутствовал на рождественских каникулах. Я установил URL-адрес внешнего интерфейса в настройках области после запуска контейнера, и у меня есть переадресация прокси-сервера, установленная на true.
Сейчас я использую действительный сертификат, подписанный ЦС, и я попытался загрузить сертификат и ключ в keycloak, что мне пришлось сделать вручную в контейнере, поскольку для расшифровки ключа требуется парольная фраза, и я нигде не видел в документации о том, как обеспечить, чтобы keycloak не смог загрузить их при запуске контейнера. После этого я создал java-хранилище ключей для своей области в разделе ключей пользовательского интерфейса keycloak. Как только происходит аутентификация, перенаправление обратно на гуакамоле завершается ошибкой, но теперь с ошибкой «Невозможно найти подходящий ключ проверки».... Альтернативное DNS-имя субъекта не соответствует proxy.xxxxx.net. Есть идеи?
Спасибо.... Как вы сказали, мне нужно загрузить сертификат в контейнер с гуакамоле. Кроме того, мы поняли, что использовали запись с подстановочными знаками для нашего CERT SAN, поэтому необходимо было обновить сертификат SAN, чтобы он был полным доменным именем, и все заработало.
Рад, что у тебя получилось. Спасибо за продолжение.
Похоже, ваш
tls.crt
(или/opt/test.crt
) неверен. Как вы его сгенерировали? (слепая догадка Let's Encrypt?). Не могли бы вы предоставить реальный URL-адрес вместо общегоhttps://example.com/
для проверки пути сертификата, пожалуйста?