У нас есть сервер Pivotal Cloud Foundry, на котором настроен сервер конфигурации Spring с ключом шифрования. В соответствующем файле свойств (через github) у нас есть префикс {cipher} для некоторых простых свойств, и мы можем просто получить значения в приложении. Но проблема, которую мы недавно заметили, заключается в том, что когда у нас есть данные base64, которые необходимо зашифровать, пружинное шифрование усекает завершающий знак равенства в конце данных base64. И когда наше приложение читает эти данные, оно не может их проанализировать, поскольку это недопустимый base64, поскольку его символ заполнения (знак равенства) в конце отсутствует. Мы пытались экранировать знак равенства с помощью обратной косой черты, но все равно безуспешно. Мы видим только две обратные косые черты, поэтому интересно, есть ли какие-либо предложения по решению этой проблемы. Спасибо!
Проблема с шифрованием Spring Cloud Config Server
Ответы (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
- https://docs.spring.io/spring-boot/docs/2.2.7.RELEASE/reference/html/spring-boot-cli.html#cli-installation
- https://cloud.spring.io/spring-cloud-static/spring-cloud-cli/2.2.1.RELEASE/reference/html/#_installation
Вы можете избежать проблем, вызванных curl, используя https://httpie.org/:
Зашифровать:
echo -n cleartext | http https://config-server.com/encrypt
Расшифровать:
echo -n ciphertext | http https://config-server.com/decrypt
VGVzdC0=
— это base64-эквивалентTest-
, который является моей необходимой строкой. Мы используем командуcurl -k -H "Authorization: $oauth" $config_url/encrypt -d "VGVzdC0="
И когда приложение получает значение от SprintConfigServer, оно получает значениеVGVzdC0
. Таким образом, мой анализатор base64 потерпит неудачу, поскольку он не увидит обязательный символ заполнения «=» в конце. - person Astronet-K2   schedule 19.05.2020