問題描述
因為Key Vault的證書上傳功能中,只支援pfx格式的證書,而中間證書,根證書不能轉換為pfx格式,只能是公鑰證書格式 cet 或者 crt,能透過文字工具直接檢視base64編碼內容。
如一個證書鏈檔案中可以看見中間證書,根證書:
當把包含完成證書鏈的證書PFX上傳到Key Vault certificates中後,certificates只會顯示伺服器證書的指紋,導致無法直接在Cloud Service(Extended Support)的配置檔案中修改。
所以,如果中間證書,根證書需要安裝到Cloud Service (Extended Support) 中,要先把中間證書,根證書放置在Key Vault Secrets中,然後呼叫Cloud Service API更新證書和配置Secrets Identifier URL來完成證書配置。
操作步驟
第一步:準備中間證書和根證書的cer 檔案
(* 如果已經有中間證書的cer/crt 檔案,用記事本檢視證書Base64編碼內容則可以跳過第一步)
檢視PFX證書及證書鏈資訊:
mmc certmgr.msc /CERTMGR:FILENAME="C:\Users\... \Downloads\mykey.pfx"
選中中間證書-> Details -> Copy to File
在開啟的嚮導視窗中,點選Next,選擇 "Base-64 encoded X.509 (.CER)“ --》設定儲存路徑 --》 匯出成功
用記事本開啟,檢視證書Base64編碼內容
(重複以上操作,把根證書也儲存為CER檔案)
(非常重要)第二步:把證書內容JSON格式化後,透過az cli命令設定到Key Vault Secret中
(這一步不能透過門戶完成)
把證書的Base64編碼內容填入JSON格式的data中
{ "data": "Your base64 certificate", "dataType": "PFX", "password": "" }
然後把JSON內容儲存為一個檔案,使用az keyvault secret set --file “” --encoding base64 新增到Key Vault中
注意:可以使用證書指紋作為機密名稱,以方便更好的關聯到證書資訊
## 設定Key Vault機密
##intermediate az keyvault secret set --vault-name <key value name> --name <thumbprint> --file ".\SSL\intermediate.txt" --encoding base64 ##root az keyvault secret set --vault-name <key value name> --name <thumbprint> --file ".\SSL\root.txt" --encoding base64
執行完成後,從返回結果中獲取到 id 值(Secret Identifier URL).
完成以上內容後,複製出指紋值和Secret ID URL,就可以透過Cloud Service (Extended Support)的API更新證書。
第三步:獲取Cloud Service的資訊,呼叫介面為GET API
參考文件:https://learn.microsoft.com/en-us/rest/api/compute/cloud-services/get?view=rest-compute-2024-07-01&tabs=HTTP
注意,在中國區需要修改Host Endpoint為:management.chinacloudapi.cn
GET https:// management.chinacloudapi.cn /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/cloudServices/{cloudServiceName}?api-version=2022-04-04
需要攜帶Authorization Token,否則會獲得如下錯誤:
{ "error": { "code": "AuthenticationFailed", "message": "Authentication failed. The 'Authorization' header is missing." } }獲取Token的方式可以透過瀏覽器訪問Cloud Service(Extended Support)門戶,然後透過開發者工具(F12)檢視網路請求,從訪問Cloud Service的請求頭中獲取Authorization內容。或者透過az cli獲取token
az cloud set --name AzureChinaCloud az login az account get-access-token --scope "https://management.core.chinacloudapi.cn/.default" --query accessToken
當成功獲取到Cloud Service的資訊後,調整 JSON內容:
刪除Properties中,除了configuration 和 osProfile 外的全部內容。
整理之後JSON格式如下:
{ "name": "cloud service extended support name", "id": "cloud service (extended) support resource id", "type": "Microsoft.Compute/cloudServices", "location": "chinanorth3", "properties": { "configuration": "{ServiceConfiguration}", "osProfile": { "secrets": [ { "sourceVault": { "id": "key vault resource id" }, "vaultCertificates": [ { "certificateUrl": "key vault Secret Identifier" }, { "certificateUrl": "key vault Secret Identifier" }, { "certificateUrl": "key vault Secret Identifier" } ] } ] } } }
需要修改的地方有兩處:
1) configuration內容中Certificates指紋,用第二步中的指紋值替換檔案中需要修改的內容
2)同時,使用第二步中的機密標識URL來替換舊的certificateUrl值
準備好以上的內容後,既可以進行第三步,傳送PUT請求把新證書更新到Cloud Service(Extended Support)
第四步:更新Cloud Service的資訊,呼叫介面為PUT API
參考文件:https://learn.microsoft.com/en-us/rest/api/compute/cloud-services/create-or-update?view=rest-compute-2024-07-01&tabs=HTTP
PUT https:// management.chinacloudapi.cn /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/cloudServices/{cloudServiceName}?api-version=2022-04-04
使用第三步中同樣的URL,把請求型別修改為PUT,然後把第三步修改的JSON放入Request Body。點選傳送,檢視請求的狀態。
* 如果遇見證書格式不對錯誤,需要檢查Key Vault Secret中儲存的內容是否是正確的JSON格式。
格式不對的錯誤資訊:
{ "error": { "code": "CertificateImproperlyFormatted", "message": "The data retrieved from https://XXXXXXXXX.vault.azure.cn/secrets/XXXXX/7eXXXX is not deserializable into JSON." } }
【END】