Linux Bash腳本自動創(chuàng)建keystore和生成公鑰方式
一、需求
現(xiàn)場有一個項目中使用了keystore證明書,現(xiàn)要求每年都需要生成一個新的keystore文件,并且根據(jù)keystore文件中的私鑰生成公鑰,然后將公鑰提供給其他項目使用。
- 生成keystore文件的命令很長,手動通過命令行輸入不僅繁瑣,而且很容易出錯,因此要求寫一個腳本實現(xiàn)
- 要求使用Bash腳本書寫,書寫完畢之后,如果在windows上安裝了
Git for Bash的話,還可以在直接在windows上執(zhí)行。
二、腳本實現(xiàn)
#!/usr/bin/env bash
# 判斷keytool命令是否被安裝
if ! command -v keytool >/dev/null 2>&1; then
echo "【keytool】命令并沒有被安裝, 請確認!"
exit 1
fi
# 判斷openssl命令是否被安裝
if ! command -v openssl >/dev/null 2>&1; then
echo "【openssl】命令并沒有被安裝, 請確認!"
exit 1
fi
# 獲取當前腳本的絕對路徑
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根據(jù)腳本的絕對路徑獲取腳本所在目錄的絕對路徑
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
# 私鑰別名
ALIAS='alias'
# 密碼
PASSWD='nosecret'
# 不帶后綴的文件名
FILE_NAME='test_mpl_ws_api'
# pem公鑰所對應的key名稱
PEM_PUBLIC_KEY='PEM_PUBLIC_KEY_PATH'
# 組織信息
DNAME_INFO='CN=KDDI, OU=IT, O=MyCompany, L=Tokyo, ST=Tokyo, C=JP'
# 創(chuàng)建一個關(guān)聯(lián)數(shù)組, 關(guān)聯(lián)數(shù)組中的key和value都可以使用變量
declare -A filePathMap=(
# keystore文件的絕對路徑
[KEYSTORE_FILE_PATH]="$SCRIPT_DIR/${FILE_NAME}.keystore"
# cer公鑰文件的所在路徑
[CER_PUBLIC_KEY_PATH]="$SCRIPT_DIR/${FILE_NAME}.cer"
# pem公鑰文件的所在路徑
["$PEM_PUBLIC_KEY"]="$SCRIPT_DIR/${FILE_NAME}.pem"
)
# 進入當前腳本所在的目錄
pushd "$SCRIPT_DIR" >/dev/null || exit 1
# 生成一個keystore文件
keytool -genkeypair \
-alias "$ALIAS" \
-keyalg RSA \
-sigalg SHA384withRSA \
-keysize 2048 \
-validity 365 \
-keystore "${filePathMap['KEYSTORE_FILE_PATH']}" \
-dname "$DNAME_INFO" \
-storepass "$PASSWD" \
-keypass "$PASSWD"
# 根據(jù)keystore文件中的私鑰生成cer格式的公鑰
keytool -exportcert \
-alias "$ALIAS" \
-keystore "${filePathMap['KEYSTORE_FILE_PATH']}" \
-storepass "$PASSWD" \
-file "${filePathMap['CER_PUBLIC_KEY_PATH']}"
# 通過openssl命令將der格式的公鑰轉(zhuǎn)換為pem格式的公鑰
openssl x509 \
-inform der \
-in "${filePathMap['CER_PUBLIC_KEY_PATH']}" \
-outform pem \
-out "${filePathMap["$PEM_PUBLIC_KEY"]}"
# 定義一個刪除文件的函數(shù)
function cleanup_files() {
local -n pathMap=$1
# 遍歷引入的map
for pathKey in "${!pathMap[@]}"; do
# local的局部變量只能在函數(shù)內(nèi)部使用
local file_path="${pathMap[$pathKey]}"
# 如果文件存在的話, 就刪除
[[ -f "$file_path" ]] && rm -- "$file_path"
done
}
# 刪除生成的文件
sleep 5
# 調(diào)用自定義的函數(shù), 傳入關(guān)聯(lián)數(shù)組, 刪除文件
cleanup_files filePathMap
# 返回到原目錄
popd >/dev/null
read -p "→ 腳本執(zhí)行結(jié)束, 按任意鍵結(jié)束 . . . " -n1 -s
三、腳本重點語法解析
獲取當前腳本絕對路徑和腳本所在的文件夾
# 獲取當前腳本的絕對路徑
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根據(jù)腳本的絕對路徑獲取腳本所在目錄的絕對路徑
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
Bash中雖然沒有Map,但是Bash中的關(guān)聯(lián)數(shù)組的特性和map類似
declare -A filePathMap=(
# keystore文件的絕對路徑
[KEYSTORE_FILE_PATH]="$SCRIPT_DIR/${FILE_NAME}.keystore"
# cer公鑰文件的所在路徑
[CER_PUBLIC_KEY_PATH]="$SCRIPT_DIR/${FILE_NAME}.cer"
# pem公鑰文件的所在路徑
["$PEM_PUBLIC_KEY"]="$SCRIPT_DIR/${FILE_NAME}.pem"
)
調(diào)用函數(shù),傳遞關(guān)聯(lián)數(shù)組
- Bash 沒法直接傳關(guān)聯(lián)數(shù)組,但你可以把數(shù)組名傳進去,用 declare -n(
Bash 4.3+)引用,Bash 4.3之前的舊版本的Bash并不支持。 -n表示nameref引用。函數(shù)內(nèi)部用local -n pathMap=$1,引用只是局部的別名,原數(shù)組本身在外部仍然存在,不會意外覆蓋或污染全局變量。- 函數(shù)結(jié)束后,局部變量的pathMap作用域消失,不影響其他變量。
function cleanup_files() {
local -n pathMap=$1
# 遍歷引入的map
for pathKey in "${!pathMap[@]}"; do
# local的局部變量只能在函數(shù)內(nèi)部使用
local file_path="${pathMap[$pathKey]}"
# 如果文件存在的話, 就刪除
[[ -f "$file_path" ]] && rm -- "$file_path"
done
}
# 調(diào)用自定義的函數(shù), 傳入關(guān)聯(lián)數(shù)組, 刪除文件
cleanup_files filePathMap
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux 不改變目錄結(jié)構(gòu)移動 home 目錄到新分區(qū)的操作方法
這篇文章主要介紹了linux 不改變目錄結(jié)構(gòu)移動 home 目錄到新分區(qū)的操作方法,需要的朋友可以參考下2017-12-12
linux確認已經(jīng)卸載數(shù)據(jù)盤并可以新建自定義鏡像
在本文中我們給大家整理了關(guān)于linux中如何確認已經(jīng)卸載數(shù)據(jù)盤并可以新建自定義鏡像的相關(guān)內(nèi)容和知識點,有需要的朋友們學習下。2018-09-09
Linux在服務器多節(jié)點下面實現(xiàn)快速查找日志
在多節(jié)點分布式系統(tǒng)中,通過使用find和grep命令組合,可以實現(xiàn)高效的日志搜索,先定位到具體日期的文件夾,再執(zhí)行命令全面掃描各個服務器節(jié)點下的日志文件,從而簡化日志查詢過程2024-11-11
從Windows到Linux的三種文件傳輸實現(xiàn)方式
文章介紹了在跨平臺工作環(huán)境中將文件從Windows系統(tǒng)傳輸?shù)絃inux服務器的幾種方法,包括使用SCP命令、搭建Web服務和使用wget下載文件,每種方法都有其特點,如安全性、速度、易用性和適用場景等2024-12-12

