脚本局限性:只解密

  • pfx格式证书
  • 加密了私钥的pem格式证书

脚本好处:可以同时解压多个证书。

脚本粗糙,但实用性尚可哈哈。

脚本内容

使用说明

]$ cat README 
======================
2021.1.15 支持pem或者pfx证书解密
======================
1、将pfx或pem证书放入pfx目录中
2、将域名和密码信息写入cert-password.txt(以空格或者tab做分隔符)
3、pfx证书执行bash cert.sh
  - pem证书执行bsh cert.sh pem

cert-password.txt

]$ cat cert-password.txt 
www.baidu.com	hfdsfds321njnK

cert.sh

]$ cat cert.sh 
#设置颜色
RED="\033[0;31m"
GREEN="\033[0;32m"
NO_COLOR="\033[0m"

#存放证书和密码的TXT文件
CERT_PASSWORD_FILE="./cert-password.txt"
#备份证书和密码
CERT_PASSWORD_BAK_FILE="./bak-cert-password.txt"
#存放pfx加密证书的目录
PFX_DIR="./pfx"
#存放解密后的证书和key
PEM_DIR="./pem"

#解密证书的函数
cert_decrypt(){
    DOMAIN=$1
    PASSWORD=$2
    PFX_FILE_PATH=${PFX_DIR}/${DOMAIN}.pfx
    CRT_FILE_PATH=${PEM_DIR}/${DOMAIN}.crt
    KEY_FILE_PATH=${PEM_DIR}/${DOMAIN}.key
    #判断pfx文件是否存在
    if [ -f  ${PFX_FILE_PATH} ];then
        #openssl pkcs12 -in ${PFX_FILE_PATH} -clcerts -nokeys  -passin pass:${PASSWORD}   -out ${CRT_FILE_PATH}
	#证书文件包含两段证书,一段是CA证书,一段是域名证书(客户端证书)
        openssl pkcs12 -in ${PFX_FILE_PATH}  -nokeys  -passin pass:${PASSWORD}   -out ${CRT_FILE_PATH}
	openssl pkcs12 -in ${PFX_FILE_PATH} -nocerts -passin pass:${PASSWORD}  -nodes  -out ${KEY_FILE_PATH}
        #如果执行失败就提示密码错误
        if [ ! "$?" -eq "0" ];then
            echo -e "${RED}${PFX_FILE_PATH}解密失败,可能密码错误......${NO_COLOR}"
        else
            echo -e "==========================
  PFX_FILE:${GREEN}${PFX_FILE_PATH}${NO_COLOR}
  CRT_FILE:${GREEN}${CRT_FILE_PATH}${NO_COLOR}
  KEY_FILE:${GREEN}${KEY_FILE_PATH}${NO_COLOR}"
        fi
	#使用sed命令可以去掉bag attributes信息,只保留证书信息
	sed -i -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' ${CRT_FILE_PATH}
	sed -i -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' ${KEY_FILE_PATH}
	#备份证书密码,防止以后用到
	#cat ${CERT_PASSWORD_FILE} >> ${CERT_PASSWORD_BAK_FILE}
	grep $DOMAIN ${CERT_PASSWORD_FILE} >> ${CERT_PASSWORD_BAK_FILE}

    else
        echo -e "${RED}${PFX_FILE_PATH}文件不存在......${NO_COLOR}"
    fi
}

#pem格式证书解压
pem_cert_decrypt(){
    DOMAIN=$1
    PASSWORD=$2
    PEM_FILE_PATH=${PFX_DIR}/${DOMAIN}.pem
    CRT_FILE_PATH=${PEM_DIR}/${DOMAIN}.crt
    KEY_FILE_PATH=${PEM_DIR}/${DOMAIN}.key
    if [ -f  ${PEM_FILE_PATH} ];then
        sed  -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' ${PEM_FILE_PATH} > ${CRT_FILE_PATH}
	openssl rsa -in ${PEM_FILE_PATH}  -passin pass:${PASSWORD}  -out ${KEY_FILE_PATH}
        #如果执行失败就提示密码错误
        if [ ! "$?" -eq "0" ];then
            echo -e "${RED}${PFX_FILE_PATH}解密失败,可能密码错误......${NO_COLOR}"
        else
            echo -e "==========================
  PFX_FILE:${GREEN}${PEM_FILE_PATH}${NO_COLOR}
  CRT_FILE:${GREEN}${CRT_FILE_PATH}${NO_COLOR}
  KEY_FILE:${GREEN}${KEY_FILE_PATH}${NO_COLOR}"
        fi
	#备份证书密码,防止以后用到
	#cat ${CERT_PASSWORD_FILE} >> ${CERT_PASSWORD_BAK_FILE}
	grep $DOMAIN ${CERT_PASSWORD_FILE} >> ${CERT_PASSWORD_BAK_FILE}

    else
        echo -e "${RED}${PEM_FILE_PATH}文件不存在......${NO_COLOR}"
    fi
}
    

main(){
    #加个flag,对pem格式证书补充说明
    FLAG=$1
    #清空pem目录
    rm -f ${PEM_DIR}/*.crt ${PEM_DIR}/*.key
    if [ ! -d ${PFX_DIR} ];then
        mkdir -p ${PFX_DIR}
    fi
    if [ ! -d ${PEM_DIR} ];then
        mkdir -p ${PEM_DIR}
    fi
    for domain in $(awk '{print $1}' ${CERT_PASSWORD_FILE});do
        password=$(grep -w "${domain}" ${CERT_PASSWORD_FILE} | awk '{print $2}')
	if   [[ -n ${FLAG} && ${FLAG} == "pem" ]];then
	    pem_cert_decrypt $domain $password
        else	    
            cert_decrypt $domain $password
	fi
    done
}
main $1

执行效果

]$ bash cert.sh 
==========================
  PFX_FILE:./pfx/www.baidu.com.pfx
  CRT_FILE:./pem/www.baidu.com.crt
  KEY_FILE:./pem/www.baidu.com.key