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】命令并沒有被安裝, 請確認(rèn)!"
exit 1
fi
# 判斷openssl命令是否被安裝
if ! command -v openssl >/dev/null 2>&1; then
echo "【openssl】命令并沒有被安裝, 請確認(rèn)!"
exit 1
fi
# 獲取當(dāng)前腳本的絕對路徑
SCRIPT_PATH="$(readlink -f "${BASH_SOURCE[0]}")"
# 根據(jù)腳本的絕對路徑獲取腳本所在目錄的絕對路徑
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
# 私鑰別名
ALIAS='alias'
# 密碼
PASSWD='nosecret'
# 不帶后綴的文件名
FILE_NAME='test_mpl_ws_api'
# pem公鑰所對應(yīng)的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"
)
# 進(jìn)入當(dāng)前腳本所在的目錄
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
三、腳本重點語法解析
獲取當(dāng)前腳本絕對路徑和腳本所在的文件夾
# 獲取當(dāng)前腳本的絕對路徑
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ù)組名傳進(jìn)去,用 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)文章
Shell 數(shù)組與關(guān)聯(lián)數(shù)組詳解及實例代碼
這篇文章主要介紹了 Shell 數(shù)組與關(guān)聯(lián)數(shù)組詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
詳解Linux文件中的數(shù)據(jù)是如何被寫進(jìn)磁盤
Linux 中,我們的每一個進(jìn)程,打開的每一個文件都要有自己的 struct inode 對象和自己的文件頁緩沖區(qū)(就是所謂的內(nèi)核緩沖區(qū)),本文我們給大家介紹了Linux文件中的數(shù)據(jù)是如何被寫進(jìn)磁盤,需要的朋友可以參考下2024-05-05
如何實現(xiàn)為Ubuntu擴(kuò)容(添加新的硬盤空間)
這篇文章主要介紹了如何實現(xiàn)為Ubuntu擴(kuò)容(添加新的硬盤空間)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Linux CentOS6.6系統(tǒng)中安裝mysql源碼包的方法
Linux系統(tǒng)中如何安裝mysql的源碼包呢?這里以CentOS6.6系統(tǒng)中安裝MySQL的源碼包,進(jìn)行講解。本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2016-10-10

