2017-08-24 12 views
0

サーバーにPOST要求を送信するbashスクリプトを作成しました。要求には証明書署名要求が含まれており、サーバーはそれに署名して証明書を返します。 POSTの本文にCSRテキストをコピー&ペーストすると、POST要求は成功します。しかし、変数からCSRを読み込むと、POSTリクエストは失敗します。私は以下のプログラムのスニペットを添付しました。CSRを含むPOST要求がBashで失敗する

PROGRAM - バッシュ

openssl req -new -newkey rsa:2048 -nodes -out cert.csr -keyout priv.key -subj "/C=MyCountry/ST=MyState/L=MyCity/O=MyCompany/OU=MyDept/CN=MyComp" 
if [ $? == 0 ]; then 
    csr=$(<cert.csr) 
fi 
response=$(curl -o - -s -w "%{http_code}\n" -X POST \ 
https://xxx.xxx.com/URI-END-POINT \ 
-H "authorization: $token" \ 
-H "content-type: application/json" \ 
-d '{ 
    "digicert": { 
    "csr": "'$csr'", 
    "profileName": "pn123", 
    "signatureHash": "sh123", 
    "userPrincipalName": "pn123", 
    "validationScopeId": "vsi123" 
    }, 
"IccId": "sim123", 
"MacAddress": "mac123" 
}') 
if [ $?==0 ]; then 
    status=$(echo $response | tail -c 4) 
    if [ "$status" == "$http_success" ]; then 
     echo -e "Request for certificate SUCCESS" 
    else 
     echo -e "Request for certificate FAILED with return code $status" 
    fi 
else 
    echo -e "Request for certificate FAILED" 
fi 

OUTPUT - 上記のスクリプトでバッシュ

curl: option -----END: is unknown 
curl: try 'curl --help' or 'curl --manual' for more information 

、私はライン"CSR" を交換する場合: " '$のCSR'"、"csr": "---- BEGIN CERTIFICATE REQUEST ---- XXXXXXX ---- END CERTIFICATE REQUEST ----"、これは正常に動作します。

これをデバッグするのに手伝ってもらえますか?

ありがとうございます!

答えて

0

おそらく$ csrの文字列が評価されています。二重引用符で囲まれ、結果の文字列が期待したものと異なる場合があります。 まず、$ csrが "$ csr"と同じかどうかを確認してください。

+0

こんにちはKlemen ワーキングソリューションのchepnerの答え@を参照してください。 –

0

ファイルの内容を投稿するには、jqを使用してJSONブロブを生成します。これにより、必要なクォートが自動的に処理されます。 jqの出力は、-dオプションに@-引数を使用すると、直接curlにパイプされます。 (@ -prefixed文字列はファイルcurlの名前はから読み取る必要があることを示し;。-は、標準入力の別名です)

response=$(jq -n --arg csr "$(<csr)" '{ 
            digicert: { 
             csr: $csr, 
             profileName: "pn123", 
             signatureHash : "sh123", 
             userPrincipalName: "pn123", 
             validationScopeId: "vsi123" 
            }, 
            IccId: "sim123", 
            MacAddress: "mac123" 
            }' | 
      curl -o - -s -w "%{http_code}\n" -X POST \ 
       https://xxx.xxx.com/URI-END-POINT \ 
       -H "authorization: $token" \ 
       -H "content-type: application/json" \ 
       -d @- 
) 
+0

ありがとうございました@chepner。私はjqコマンドに "-n"オプションを追加しなければなりませんでした。これはjqマニュアルの通りです: '入力を全く読まないでください!代わりに、フィルターは入力としてnullを使用して1回実行されます。これは、jqを単純な電卓として使用する場合や、JSONデータをゼロから構築する場合に便利です。 ' もう一度おねがいします! –

+0

申し訳ありません。それは私がメモリからこの答えを書き直すために得たものです。私は本当にこれの標準バージョンを見つけるか作成する必要があります。 – chepner

関連する問題