openssl生成p12,jks,cer证书相关操作
说明
由于开发过程中会使用到证书相关的生成及认证,在网上找了些相关的证书生成以及使用的方式,以此备忘。
生成证书
从根证书一步步生成到jks证书相关的过程:
- 创建根证私钥 ;
openssl genrsa -out root-key.key 1024 - 创建根证书请求文件;
openssl req -new -out root-req.csr -key root-key.key -keyform PEM - 通过根证书及请求文件生成自签根证书;
openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650 - 通过自签根证书及根证书导出p12格式根证书;
openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12 - 通过自签根证书及密码生成root.jks文件;
keytool -import -v -trustcacerts -storepass 123456 -alias root -file root-cert.cer -keystore root.jks
生成客户端文件
类似于从从根证书一步步生成到jks证书相关的过程生成客户端文件:
- 生成客户端key ;
openssl genrsa -out client-key.key 1024 - 生成客户端请求文件;
openssl req -new -out client-req.csr -key client-key.key - 生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书);
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer -CAkey root-key.key -CAcreateserial -days 3650 - 生成客户端p12格式根证书;
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12 - 生成客户端jks;
keytool -import -v -trustcacerts -storepass 123456 -alias client -file client-cert.cer -keystore client.jks
生成服务端文件
- 生成服务端key ;
openssl genrsa -out server-key.key 1024 - 生成服务端请求文件;
openssl req -new -out server-req.csr -key server-key.key - 生成服务端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书);
openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer -CAkey root-key.key -CAcreateserial -days 3650 - 生成服务端p12格式根证书;
openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12 - 服务端JKS;
keytool -import -v -trustcacerts -storepass 123456 -alias server -file server-cert.cer -keystore server.jks
无密码key命令
- 无密码key ;
openssl rsa -in client-key.key -out client-key.key.unsecure
私钥对文件签名,公钥进行验证并解密
- 私钥签名脚本 ;
#!/bin/bash
# 这个是用私钥签名脚本,对应的是公钥验证
# 需要加密的文件
ENCRYPT_FILE=$1
# 私钥文件
USER_KEY=$2
if [ ! -f $ENCRYPT_FILE ]; then
echo "待加密文件 $ENCRYPT_FILE 不存在,退出程序"
exit 1
fi
work_path=$(dirname $0)
USER_KEY=$work_path/genrsa.pri
ENCRYPT_FILE_PATH=`dirname $ENCRYPT_FILE`/
ENCRYPT_FILE_NAME=`basename $ENCRYPT_FILE`
ENCRYPT_FILE_AES=${ENCRYPT_FILE_PATH}${ENCRYPT_FILE_NAME}".aes"
URANDOM_STRING_FILE=${ENCRYPT_FILE_PATH}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${ENCRYPT_FILE_PATH}"urandom.rsa"
# 加密后生成的文件, 默认pkg结尾
ENCRYPT_FILE_PKG=$ENCRYPT_FILE_PATH`echo $ENCRYPT_FILE | sed 's/^.*\///' | sed 's/\..*$/_enc\.pkg/'`
# 随机产生一个key值,并保存到urandom.key
dd if=/dev/urandom bs=32 count=1 2>/dev/null | hexdump -v -e '/1 "%02X"' > ${URANDOM_STRING_FILE}
# 用私钥签名
openssl rsautl -sign -in ${URANDOM_STRING_FILE} -inkey ${USER_KEY} -out ${URANDOM_STRING_FILE_ENCRYPT}
# 加密需要加密的文件,kfile为上面产生的urandom.key
openssl enc -e -aes-256-cbc -in ${ENCRYPT_FILE} -kfile ${URANDOM_STRING_FILE} -out ${ENCRYPT_FILE_AES}
# 将 opensslurandom.key而产生的urandom.des3 和
# openssl 加密文件而产生的ENCRYPT_FILE_AES文件
# 一起放入的一个文件中
# 这里urandom.des3的字节长度为256,解密时要记得
cat ${URANDOM_STRING_FILE_ENCRYPT} ${ENCRYPT_FILE_AES} > ${ENCRYPT_FILE_PKG}
# 删除不需要的文件
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT} ${ENCRYPT_FILE}
echo "success"
exit 0
- 公钥验签解签脚本 ;
#!/bin/bash
# 这个是公钥验证脚本,对应的是私钥签名的脚本
# 需要解密的文件
ENCRYPT_PKG=$1
if [ ! -f $ENCRYPT_PKG ]; then
echo "待加密文件 $ENCRYPT_PKG 不存在,退出程序"
exit 1
fi
work_path=$(dirname $0)
USER_KEY=$work_path/rsa.pub
ENCRYPT_PKG_PATH=`dirname $ENCRYPT_PKG`/
ENCRYPT_PKG_NAME=`basename $ENCRYPT_PKG`
FILENAME=`echo $ENCRYPT_PKG_NAME | sed 's/^.*\///'`
ENCRYPT_FILE_AES=${ENCRYPT_PKG_PATH}${FILENAME}".aes"
URANDOM_STRING_FILE=${ENCRYPT_PKG_PATH}"urandom.key"
URANDOM_STRING_FILE_ENCRYPT=${ENCRYPT_PKG_PATH}"urandom.rsa"
# 解密后的文件默认是 .zip 类型压缩文件
DECRYPT_FILE=${ENCRYPT_PKG_PATH}`echo ${FILENAME} | sed 's/_enc.*$/\.zip/'`
dd if=${ENCRYPT_PKG} of=$URANDOM_STRING_FILE_ENCRYPT bs=256 count=1
dd if=${ENCRYPT_PKG} of=${ENCRYPT_FILE_AES} bs=256 skip=1
#openssl enc -d -des3 -a -salt -in ${URANDOM_STRING_FILE_ENCRYPT} -kfile ${USER_KEY} -out ${URANDOM_STRING_FILE}
# 用公钥验证
openssl rsautl -verify -in ${URANDOM_STRING_FILE_ENCRYPT} -inkey ${USER_KEY} -pubin -out ${URANDOM_STRING_FILE}
openssl enc -d -aes-256-cbc -in ${ENCRYPT_FILE_AES} -kfile ${URANDOM_STRING_FILE} -out ${DECRYPT_FILE}
rm -f ${ENCRYPT_FILE_AES} ${URANDOM_STRING_FILE} ${URANDOM_STRING_FILE_ENCRYPT} ${ENCRYPT_PKG}
echo "success"
exit 0
关于springboot开启https使用
以下两种情况选用一种情况即可开启,使用application.properties文件或application.yml文件配置都能
- 使用jks文件-application.properties文件增加配置 ;
server.ssl.key-store=classpath:client.jks
server.ssl.key-store-password=654321
server.ssl.keyStoreType=JKS
#server.ssl.keyAlias=client
#使用绝对路径
#server.ssl.trust-store=/home/conf/tomcat.jks
#使用相对路径
#server.ssl.trust-store=classpath:trust.jks
#server.ssl.trust-store-password=654321
#server.ssl.client-auth=need
#server.ssl.trust-store-type=JKS
#server.ssl.trust-store-provider=SUN
- 使用.p12文件-application.yml文件增加配置 ;
server:
ssl:
enabled: true
key-store: classpath:server.p12
# key-password: 654321
key-store-password: 654321
key-store-type: PKCS12
key-alias: 123