Springboot 证书配置实战

1,036 阅读3分钟

Springboot证书配置指南

创建证书

生成CA证书

  • 生成CA证书
openssl req -new -x509 -keyout ca.key -out ca.crt -sha256 -days 365 -passout pass:${PASSWD} -subj "/C=cn/ST=beijing/L=beijing/O=aspire/OU=aspire/CN=ca.it"
  • 将CA证书加到客户端信任库,用来客户端认证服务器身份时,通过CA证书校验服务器证书的有效性
keytool -keystore client.truststore -alias caroot -import -file ca.crt -storepass ${PASSWD}
  • 将CA证书加到服务器端信任库,用来服务器端认证客户端身份时,通过CA证书校验客户端证书的有效性
keytool -keystore server.truststore -alias caroot -import -file ca.crt -storepass ${PASSWD}

生成服务器证书

  1. 生成公私钥keypair
openssl genrsa -passout pass:${PASSWD} -out server.key 2048
  1. 生成待签名文件
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SHANXI/L=XI'AN/O=TW/OU=IT/CN=${HOSTNAME}"
  1. 使用CA证书签名CSR文件,生成server证书

Create X509 V3 certificate extension config file

cat>server.ext<<EOF
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = test.it
IP.1 = 127.0.0.1
EOF

签名生成server证书

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:${PASSWD} -CAcreateserial -out server.crt -sha256 -extensions v3_req -extfile server.ext
  1. 将openssl生成的证书转换为pkcs12格式
# 转换为pkcs12密钥库
openssl pkcs12 -export -passout pass:${PASSWD} -in server.crt -inkey server.key -out server.p12 -name server -chain -CAfile ca.crt -caname rootca

将pkcs12证书导入到jks类型的server.keystore中,如果在application.yml中指定的类型为pkcs12,则无需此步骤,直接指定pkcs12类型的证书即可

keytool -importkeystore \
-deststorepass ${PASSWD} -destkeypass ${PASSWD} -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass ${PASSWD} \
-alias server

生成客户端证书

  1. 生成公私钥keypair
openssl genrsa -des3 -passout pass:${PASSWD} -out client.key 4096
  1. 生成待签名文件
openssl req -new -key client.key -passin pass:${PASSWD} -out client.csr -subj "/C=CN/ST=SHANXI/L=XI'AN/O=TW/OU=IT/CN=client"
  1. 使用CA证书签名CSR文件,生成server证书
openssl x509 -req -days 365 -in client.csr -passin pass:${PASSWD}  -CA ca.crt -CAkey ca.key  -set_serial 01 -out client.crt  -sha256
  1. 将openssl生成的证书转换为pkcs12格式
openssl pkcs12 -export -passout pass:${PASSWD} -in client.crt -inkey client.key -passin pass:${PASSWD} -out client.p12 -name client -chain -CAfile ca.crt -caname caroot
  1. 将pkcs12证书导入到jks类型的client.keystore中,根据客户端需要的keystore类型,选择是否需要此步骤,一般postman是需要此步骤的
keytool -importkeystore \
-deststorepass ${PASSWD} -destkeypass ${PASSWD} -destkeystore client.keystore \
-srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass ${PASSWD} \
-alias client

脚本

#!/bin/bash
#define
PASSWD=localhost
HOSTNAME=test.it

#precondition
 rm -f ca*
 rm -f client.*
 rm -f server.*
echo "create "

echo "######### ca"
openssl req -new -x509 -keyout ca.key -out ca.crt -sha256 -days 365 -passout pass:${PASSWD} -subj "/C=cn/ST=beijing/L=beijing/O=aspire/OU=aspire/CN=ca.it"
openssl x509 -in ca.crt -out ca.pem -outform PEM

keytool -keystore client.truststore -alias caroot -import -file ca.crt -storepass ${PASSWD}

keytool -keystore server.truststore -alias caroot -import -file ca.crt -storepass ${PASSWD}

echo "######### server"
openssl genrsa -passout pass:${PASSWD} -out server.key 2048

openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SHANXI/L=XI'AN/O=TW/OU=IT/CN=${HOSTNAME}"

cat>server.ext<<EOF
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = test.it
IP.1 = 127.0.0.1
EOF

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:${PASSWD} -CAcreateserial -out server.crt -sha256 -extensions v3_req -extfile server.ext
openssl x509 -in server.crt -out server.pem -outform PEM
# 转换为pkcs12密钥库
openssl pkcs12 -export -passout pass:${PASSWD} -in server.crt -inkey server.key -out server.p12 -name server -chain -CAfile ca.crt -caname rootca

# 导入到server.keystore中
keytool -importkeystore \
-deststorepass ${PASSWD} -destkeypass ${PASSWD} -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass ${PASSWD} \
-alias server


echo "######### client"
openssl genrsa -des3 -passout pass:${PASSWD} -out client.key 4096
openssl req -new -key client.key -passin pass:${PASSWD} -out client.csr -subj "/C=CN/ST=SHANXI/L=XI'AN/O=TW/OU=IT/CN=client"
openssl x509 -req -days 365 -in client.csr -passin pass:${PASSWD}  -CA ca.crt -CAkey ca.key  -set_serial 01 -out client.crt  -sha256
openssl x509 -in client.crt -out client.pem -outform PEM
openssl pkcs12 -export -passout pass:${PASSWD} -in client.crt -inkey client.key -passin pass:${PASSWD} -out client.p12 -name client -chain -CAfile ca.crt -caname caroot

# 导入到client.keystore中
keytool -importkeystore \
-deststorepass ${PASSWD} -destkeypass ${PASSWD} -destkeystore client.keystore \
-srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass ${PASSWD} \
-alias client

单向认证配置(客户端校验服务器端证书)

服务器端

application.yml配置

server:
  port: 443
  ssl:
    enabled: true
    key-alias: alias-test.it
    key-store: classpath:server.keystore.jks
    key-store-type: jks # pkcs12 jks
    key-store-password: localhost
    key-password: localhost

配置ssl debug启动参数方便调试

-Djavax.net.debug=all

客户端配置

使用浏览器或者postman做为客户端访问server

  • 客户端需要安装CA证书并且信任证书

    image-20220711150754730

双向认证配置

服务器端

application.yml配置

server:
  port: 443
  ssl:
    enabled: true
    key-alias: server
    key-store: classpath:server.keystore
    key-store-type: jks # pkcs12 jks
    key-store-password: localhost
    key-password: localhost
    trust-store: classpath:server.truststore
    trust-store-password: localhost
    client-auth: need

由于服务端需要校验客户端身份,所以服务端需要信任server证书,用来校验客户端证书

client-auth: need 用来开启校验客户端身份

在启动参数添加启动参数:-Djavax.net.debug=all方便调试

客户端配置

使用浏览器做为客户端访问server

  • 客户端需要安装CA证书并且信任

    image-20220711150754730

  • 安装client.pfx证书,安装格式一定要是包含私钥格式的证书:pkcs12/pfx,安装时会提示输入证书密码

image-20220712182027074

在浏览器中访问 test.it,会自动提示选择证书,浏览器之所以能找到client证书,是因为服务器端通过信任的ca证书找到颁发的子证书

image-20220712182210293

使用postman做为客户端访问server

打开postman偏好设置,打开Certificates标签页,导入相应的证书

image-20220711162221319

image-20220711162253608

image-20220712222426474

  • hosts文件中配置域名映射
# 外网ip对应的域名
127.0.0.1 test.it