2017-08-24 54 views
0

我寫了一個bash腳本,它向服務器發送POST請求。該請求包含證書籤名請求,服務器簽名並返回證書。 當我將CSR文本複製並粘貼到POST正文中時,POST請求成功。但是當我從變量中讀取CSR時,POST請求失敗。我附上了下面的程序片段。包含CSR的POST請求在Bash中失敗

程序 - 巴什

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 

輸出 - 巴什

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

在上面的腳本,如果我更換線「企業社會責任」: 「 '$企業社會責任'」,「csr」:「---- BEGIN CERTIFICATE REQUEST ---- XXXXXXX ---- END CERTIFICATE REQUEST ----」,那麼這將工作正常。

你能幫我調試嗎?

謝謝!

回答

0

也許$ csr中的字符串正在被評估,就好像放在雙引號中一樣,結果字符串與預期的不同。 首先,嘗試查看$ csr是否與「$ csr」相同。

+0

嗨Klemen 見@ chepner的答案是一個有效方法。 –

0

要發佈文件的內容,請使用jq爲您生成JSON blob:這將自動處理任何必要的引用。 jq的輸出通過使用-d選項的@-參數直接輸入到curl。 (A @ -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作爲輸入運行一次。當使用jq作爲簡單的計算器或從頭開始構建JSON數據時,這非常有用。「 再次感謝! –

+0

對不起,關於這一點。這就是我重新從內存中重寫這個答案。我真的需要找到或創建一個規範版本。 – chepner