Развернутое приложение не может обменять код oauth2 на токен - PullRequest
1 голос
/ 03 мая 2020

Локально все работает!

Однако после развертывания в моем кластере Kubernetes k3s на raspberrypi, который доступен через домен https, обмен кода oauth2 для функции токена не работает. В настоящее время я поддерживаю аутентификацию через Google и GitHub, и у них обоих есть эта проблема. Ниже приведены журналы:

Ошибка входа в GitHub:

org.springframework.security.oauth2.core.OAuth2AuthenticationException: 
[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response: Error while extracting response for type [class org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse] and content type [application/json;charset=utf-8]; 
nested exception is org.springframework.http.converter.HttpMessageNotReadableException: An error occurred reading the OAuth 2.0 Access Token Response: tokenValue cannot be empty; 
nested exception is java.lang.IllegalArgumentException: tokenValue cannot be empty

Ошибка входа в Google:

org.springframework.security.oauth2.core.OAuth2AuthenticationException: 
[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response: I/O error on POST request for "https://www.googleapis.com/oauth2/v4/token": Invalid ECDH ServerKeyExchange signature; 
nested exception is javax.net.ssl.SSLHandshakeException: Invalid ECDH ServerKeyExchange signature

Что я уже пробовал:

Я думал, что это может быть проблема с отправкой запросов https из моего кластера Kubernetes, но я подключился к работающему модулю и свернул https://google.com, и он работал просто отлично.

Вы, ребята, столкнулись с такой проблемой?

@ edit Я использую Java 11

@ edit2 Кажется, проблема с docker на моем raaspberrypi. Завершение запросов https работает нормально, но использование RestTemplate в Java не работает

@ edit3 Обнаружена связанная проблема https://github.com/docker-library/tomcat/issues/182

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Проблема решена и вообще не связана с конфигурацией пружины или oauth.

Adoptopenjdk Docker Изображение для руки повреждено. Это мешает делать запросы https. Даже следующий пример не удался:

RestTemplate().getForEntity("https://google.com", String::class.java)

Таким образом, решение состоит в том, чтобы поменять битое базовое изображение в моем Dockerfile следующим образом:

Предыдущий:

FROM adoptopenjdk/openjdk11:armv7l-ubuntu-jdk-11.0.6_10-slim

Текущий:

FROM arm32v7/openjdk:11.0.3-slim
0 голосов
/ 04 мая 2020

Предполагая, что вы используете один и тот же контейнер / исполняемый файл / библиотеки как локально, так и в Kubernetes, и, основываясь на сообщениях об ошибках, которыми вы поделились, наиболее вероятная причина - разные учетные данные и / или личные ключи между вашей локальной средой и вашей средой Kubernetes.

Ошибки выглядят по-разному для Github и Google, хотя. Первая ошибка (GitHub) выглядит так, как будто вы отправляете пустой токен.

Вторая ошибка (Google), как будто вы отправляете закрытый ключ, который не соответствует сертификату. На основе на похожих Java ошибках :

Invalid ECDH ServerKeyExchange signature может указывать, что ключ и соответствующий сертификат не совпадают и вызывают сбой рукопожатия. Проверьте содержимое каждого из файлов, которые вы используете для своих настроенных центров сертификации, сертификатов и ключей. В частности, убедитесь, что ключ и сертификат принадлежат одной паре ключей.

...