Проблема с шифрованием Spring Cloud Config Server

У нас есть сервер Pivotal Cloud Foundry, на котором настроен сервер конфигурации Spring с ключом шифрования. В соответствующем файле свойств (через github) у нас есть префикс {cipher} для некоторых простых свойств, и мы можем просто получить значения в приложении. Но проблема, которую мы недавно заметили, заключается в том, что когда у нас есть данные base64, которые необходимо зашифровать, пружинное шифрование усекает завершающий знак равенства в конце данных base64. И когда наше приложение читает эти данные, оно не может их проанализировать, поскольку это недопустимый base64, поскольку его символ заполнения (знак равенства) в конце отсутствует. Мы пытались экранировать знак равенства с помощью обратной косой черты, но все равно безуспешно. Мы видим только две обратные косые черты, поэтому интересно, есть ли какие-либо предложения по решению этой проблемы. Спасибо!


person Astronet-K2    schedule 19.05.2020    source источник
comment
Как вы пытаетесь зашифровать значение? Можете ли вы привести пример? К вашему сведению, если вы запускаете команду из командной строки, вы можете стать жертвой выхода из оболочки. Если вы работаете в оболочке Linux/Unix, попробуйте использовать одинарные кавычки вокруг ваших значений.   -  person Daniel Mikusa    schedule 19.05.2020
comment
Спасибо, вот подробности. VGVzdC0= — это base64-эквивалент Test-, который является моей необходимой строкой. Мы используем команду curl -k -H "Authorization: $oauth" $config_url/encrypt -d "VGVzdC0=" И когда приложение получает значение от SprintConfigServer, оно получает значение VGVzdC0. Таким образом, мой анализатор base64 потерпит неудачу, поскольку он не увидит обязательный символ заполнения «=» в конце.   -  person Astronet-K2    schedule 19.05.2020
comment
И мы используем оболочку git bash на машине с Windows. Мы использовали эту оболочку для успешного шифрования других приложений, а также для создания всех наших ключей для производственных сред, и мы никогда не видели никаких проблем. Спасибо еще раз.   -  person Astronet-K2    schedule 19.05.2020
comment
Можете ли вы поделиться некоторыми подробностями о том, какие версии вы используете здесь? Используете ли вы OSS Spring Cloud Config Server или Pivotal Spring Cloud Config Server? Какие версии Spring Boot, Spring Cloud в вашем клиентском приложении и, если используется Pivotal SCS, зависимости Pivotal SCS? Спасибо   -  person Daniel Mikusa    schedule 20.05.2020
comment
Мы используем Pivotal Sprint Cloud Config Server, v-2.7 (нижняя версия) и v-2.4 (prod). У нас есть TIBCO BusinessWorks Container Edition, а также услуги SprintBoot. С точки зрения непосредственных свойств мы не видим никаких проблем, поскольку значение свойства base64 интерпретируется просто отлично (со знаком = в конце), но единственный сбой возникает, когда это значение передается нашим службам через Spring Cloud. Сервер конфигурации. Итак, мы видим, что виноват PCF Spring Cloud Config Server. Мне также интересно, есть ли возможность избежать персонажа или что-то в этом роде. Спасибо @DanielMikusa!   -  person Astronet-K2    schedule 21.05.2020
comment
Эти номера версий не совпадают. Основной SCS — 2.0, 2.1, 3.0 и 3.1. См. network.pivotal.io/products/p-spring-cloud-services< /а>.   -  person Daniel Mikusa    schedule 22.05.2020
comment
@DanielMikusa, наши Spring Cloud Services версии 3.1.5. Спасибо!   -  person Astronet-K2    schedule 22.05.2020


Ответы (2)


Проблема здесь, насколько я могу судить, связана с использованием curl. Я могу воспроизвести проблему, которую вы видите, запустив:

spring decrypt --key @${HOME}/server_rsa_no_eol.key "$(curl -H "Authorization: $(cf oauth-token)" https://config-server.example.com/encrypt -s -d 'VGVzdC0=')"

Это использует curl для достижения конечной точки шифрования, берет результат и немедленно расшифровывает его с помощью spring decrypt. Как вы указали, это возвращает VGVzdC0.

Похоже, это проблема с закручиванием, потому что я могу отправить тот же пост на https://httpbin.org/post и я получаю тот же результат, VGVzdC0 без =.

$ curl https://httpbin.org/post --data 'VGVzdC0='
{
  ...
  "form": {
    "VGVzdC0": ""
  },
  ...

Что работает, так это если я закодирую URL-адрес символа =.

$ curl https://httpbin.org/post --data 'VGVzdC0%3D'
{
  ...
  "form": {
    "VGVzdC0=": ""
  },
  ...

Вы также можете заставить curl кодировать URL, используя --data-urlencode, но есть одна загвоздка. Перед значением необходимо поставить префикс =. Так это тоже работает

$ curl https://httpbin.org/post --data-urlencode '=VGVzdC0='
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "VGVzdC0=": ""
  },
...

На странице руководства curl:

  --data-urlencode <data>
          (HTTP) This posts data, similar to the other -d, --data options with the exception that this performs URL-encoding.

          To be CGI-compliant, the <data> part should begin with a name followed by a separator and a content specification. The <data> part can be passed to curl using one of the following
          syntaxes:

          content
                 This will make curl URL-encode the content and pass that on. Just be careful so that the content doesn't contain any = or @ symbols, as that will then make the syntax match
                 one of the other cases below!

          =content
                 This will make curl URL-encode the content and pass that on. The preceding = symbol is not included in the data.

Ключ последней части =content. Это заставит URL-адрес curl кодировать содержимое, а префикс = не будет включен.

Если я повторю свой тест выше, я получу ожидаемый результат VGVzdC0=.

spring decrypt --key @${HOME}/server_rsa_no_eol.key "$(curl -H "Authorization: $(cf oauth-token)" https://config-server.example.com/encrypt -s --data-urlencode '=VGVzdC0=')"

Кроме того, вы также можете выбрать простой вариант и установить Spring Boot CLI + Spring Cloud Extension. Тогда вы можете просто spring encrypt --key @${HOME}/server_rsa_no_eol.key 'VGVzdC0=' и вы получите правильные значения. Это означает, что вам нужна копия ключа на вашем локальном компьютере, который у вас может быть, а может и не быть.

brew install springboot
spring install org.springframework.cloud:spring-cloud-cli:2.2.1.RELEASE
person Daniel Mikusa    schedule 02.06.2020
comment
@Astronet-K2 Помогло ли это? Дайте мне знать, если это не так. - person Daniel Mikusa; 06.06.2020
comment
Это очень помогло. Большое спасибо вам обоим за помощь, @Daniel и Halfer. - person Astronet-K2; 09.06.2020

Вы можете избежать проблем, вызванных curl, используя https://httpie.org/:

Зашифровать:

echo -n cleartext | http https://config-server.com/encrypt

Расшифровать:

echo -n ciphertext | http https://config-server.com/decrypt
person Ortomala Lokni    schedule 28.10.2020