Интересно, почему при попытке загрузить сертификат Letsencrypt .pem с помощью cURL в API Cloudflare выдается ошибка «Неправильный JSON в теле запроса»? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть скрипт, который пытается заменить сертификат 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: webdev@autoxxx.com.au" \
     -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}

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

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

1 Ответ

0 голосов
/ 13 декабря 2018

Я много искал в 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: webdev@autoxxx.com.au" \
     -H "X-Auth-Key: pg5Q89JI33nsgdA9iZwPky3q" \
     -H "Content-Type: application/json" \
     -d "$DATA" --trace-ascii /dev/stdout
...