openssl常用证书生成及相关使用

说明

由于开发过程中会使用到证书相关的生成及认证,在网上找了些相关的证书生成以及使用的方式,以此备忘。

生成证书

从根证书一步步生成到jks证书相关的过程:

  1. 创建根证私钥
    openssl genrsa -out root-key.key 1024
  2. 创建根证书请求文件;
    openssl req -new -out root-req.csr -key root-key.key -keyform PEM
  3. 通过根证书及请求文件生成自签根证书;
    openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650
  4. 通过自签根证书及根证书导出p12格式根证书;
    openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12
  5. 通过自签根证书及密码生成root.jks文件;
    keytool -import -v -trustcacerts -storepass 123456 -alias root -file root-cert.cer -keystore root.jks

生成客户端文件

类似于从从根证书一步步生成到jks证书相关的过程生成客户端文件:

  1. 生成客户端key
    openssl genrsa -out client-key.key 1024
  2. 生成客户端请求文件;
    openssl req -new -out client-req.csr -key client-key.key
  3. 生成客户端证书(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
  4. 生成客户端p12格式根证书;
    openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
  5. 生成客户端jks;
    keytool -import -v -trustcacerts -storepass 123456 -alias client -file client-cert.cer -keystore client.jks

生成服务端文件

  1. 生成服务端key
    openssl genrsa -out server-key.key 1024
  2. 生成服务端请求文件;
    openssl req -new -out server-req.csr -key server-key.key
  3. 生成服务端证书(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
  4. 生成服务端p12格式根证书;
    openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12
  5. 服务端JKS;
    keytool -import -v -trustcacerts -storepass 123456 -alias server -file server-cert.cer -keystore server.jks

无密码key命令

  1. 无密码key
    openssl rsa -in client-key.key -out client-key.key.unsecure

私钥对文件签名,公钥进行验证并解密

  1. 私钥签名脚本
#!/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

  1. 公钥验签解签脚本
#!/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文件配置都能

  1. 使用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
  1. 使用.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值