Интересно, почему попытка загрузить сертификат Letsencrypt .pem с помощью cURL в Cloudflare API выдает ошибку Malformed JSON в теле запроса?

У меня есть сценарий, который пытается заменить сертификат SSL моего сайта на Cloudflare. Certbot автоматически обновляет сертификат на локальном сервере от Letsencrypt каждые три месяца. Теперь сертификат SSL .pem, обновленный certbot, необходимо загрузить в Cloudflare с помощью его API.

PRIVATE_KEY="/etc/letsencrypt/live/autoxxx.com.au/privkey.pem"

CERTIFICATE="/etc/letsencrypt/live/aautoxxx.com.au/cert.pem"

# read from files
PRIVATE_KEY=`cat $PRIVATE_KEY`
CERTIFICATE=`cat $CERTIFICATE`

DATA='{"private_key":"'$PRIVATE_KEY'","certificate":"'$CERTIFICATE'","bundle_method":"ubiquitous"}' 

curl -i \
     -X PATCH "https://api.cloudflare.com/client/v4/zones/rCWR4i3A24NZEzI4dFLYLAhU7tUBtJUSYQkh/custom_certificates/iqXVG2FV8Cgj5FXGMexIoJovtFQx5UhecVya" \
     -H "X-Auth-Email: [email protected]" \
     -H "X-Auth-Key: pg5Q89JI33nsgdA9iZwPky3q" \
     -H "Content-Type: application/json" \
     -d "$DATA" --trace-ascii /dev/stdout

Но при запуске этого скрипта возникает следующая ошибка

{"success":false,"errors":[{"code":6007,"message":"Malformed JSON in request body"}],"messages":[],"result":null}

Пробовал предложение цитаты, как в ответе на следующий вопрос, но все та же ошибка.

Почему я получаю неправильный формат JSON в теле запроса в этом вызове cURL?


person yebowhatsay    schedule 13.12.2018    source источник


Ответы (1)


Я много искал в Google. Пробовал следующее https://docs.vmware.com/en/Unified-Access-Gateway/3.0/com.vmware.access-point-30-deploy-config.doc/GUID-870AF51F-AB37-4D6C-B9F5-4BFEB18F11E9.html, чтобы поместить .pem в одну строку. Используется awk 'NF {sub (/ \ r /, ""); printf "% s \ n", $ 0;} 'для достижения этой цели, но теперь он выдал ответ "Недействительный сертификат".

Следующий код отлично работает. Вышеупомянутая команда awk заменяла возврат каретки новой строкой \ n, но Cloudflare, по-видимому, хочет буквальный "\ n".

PRIVATE_KEY="/etc/letsencrypt/live/autoxxx.com.au/privkey.pem"

CERTIFICATE="/etc/letsencrypt/live/aautoxxx.com.au/cert.pem"

# read from file, put the .pem into single line and replace carriage returns with the literal "\n"
PRIVATE_KEY=`awk 'NF {sub(/\r/, ""); printf "%s\\\n",$0;}' $PRIVATE_KEY`
CERTIFICATE=`awk 'NF {sub(/\r/, ""); printf "%s\\\n",$0;}' $CERTIFICATE`

DATA='{"private_key":"'$PRIVATE_KEY'","certificate":"'$CERTIFICATE'","bundle_method":"ubiquitous"}' 

curl -i \
     -X PATCH "https://api.cloudflare.com/client/v4/zones/rCWR4i3A24NZEzI4dFLYLAhU7tUBtJUSYQkh/custom_certificates/iqXVG2FV8Cgj5FXGMexIoJovtFQx5UhecVya" \
     -H "X-Auth-Email: [email protected]" \
     -H "X-Auth-Key: pg5Q89JI33nsgdA9iZwPky3q" \
     -H "Content-Type: application/json" \
     -d "$DATA" --trace-ascii /dev/stdout
person yebowhatsay    schedule 13.12.2018