springboot单向认证和双向认证
- 单向认证
服务端开启 SSL 证书,通过 springboot 或者 nginx 都可以实现, 开启单向认证后访问服务端接口需要使用 https 协议即可。
server:
port: 8443
ssl:
enabled: true
key-store: classpath:server.jks
key-store-passwd: 123456
key-store-type: JKS
- 双向认证
springboot 服务端除了开启 SSL 证书,还要开启客户端证书认证 client-auth: need
, 需要将客户端证书导入到服务端信任库
中, 否则访问报错, 提示无法建立连接, 不接受您的登录证书, 或者您可能没有提供登录证书
等报错信息.
server:
port: 8443
ssl:
enabled: true
key-store: classpath:server.jks
key-store-passwd: 123456
key-store-type: JKS
client-auth: need
trust-store: classpath:server.jks
trust-store-password: 123456
trust-store-type: JKS
keytool -genkeypair -alias test_server -keypass 123456 -storepass 123456 -dname "C=CN,ST=JS,L=NJ,O=test,OU=dev,CN=test.server.cn" -keyalg RSA -keysize 20
48 -validity 3650 -keystore test_server.jks
keytool -genkeypair -alias test_client -keypass 123456 -storepass 123456 -dname "C=CN,ST=JS,L=NJ,O=test,OU=dev,CN=test.client.cn" -keyalg RSA -keysize 20
48 -validity 3650 -keystore test_client.jks
keytool -exportcert -keystore test_client.jks -rfc -file test_client.cer -alias test_client -storepass 123456
keytool -importcert -keystore test_server.jks -file test_client.cer -alias test_client -storepass 123456 -noprompt
在信任库中, 导入后的证书为 trustedCertEntry
实体类型,而私钥证书为 PrivateKeyEntry
.
上述操作完成后, 就可以通过客户端证书调用服务端接口,但是想要服务端调用客户端,需要按照上述步骤将服务端证书导入到客户端信任库.
keytool -list -keystore test_server.jks -storepass 123456
keytool -list -v -keystore test_server.jks -storepass 123456
keytool -printcert -file test_client.cer
openssl 创建自签名证书
openssl genrsa -out my.key 2048
openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650
openssl req -x509 -newkey rsa:2048 -nodes -keyout my.key -out my.crt -days 3650 -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
openssl 创建私有CA签发的证书
openssl req -x509 -newkey rsa:2048 -nodes -keyout ca.key -out ca.crt -days 3650 -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
openssl verify -CAfile ca.crt server.crt
openssl创建的证书导入java证书信任库
keytool -importcert -keystore test_server.jks -file openssl_client.crt -alias test_client -storepass 123456 -noprompt
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
-srcstoretype jks -deststoretype pkcs12 -srcstorepass 111111 -deststorepass 111111 -destkeypass 111111 -noprompt
keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore \
-srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \
-deststorepass 111111 -srcstorepass 111111
- Nginx 证书 转 JKS
Java 通常使用 JKS 作为证书存储格式,而Nginx往往采用 PEM 证书格式
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -name server -out server.p12
keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore \
-srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \
-deststorepass 111111 -srcstorepass 111111
如果 p12 文件中未指定实体名称,使用 keytool 转换时则不需提供 srcalias/destalias 参数,而输出的 keystore 实体名称默认为 1
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 \
-srcstoretype jks -deststoretype pkcs12 -srcalias server -destalias server \
-deststorepass 111111 -destkeypass 111111 -srcstorepass 111111
openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass:111111 -out server.crt
openssl pkcs12 -in server.p12 -nocerts -password pass:111111 -passout pass:111111 -out server.key
postman 双向认证测试
- 创建服务端信任库
- 创建客户端证书
- 将客户端证书添加到服务端信任库
postman
设置选择:setting
- General
- 关闭SSL certificate verification
postman
设置选择:setting
- Certificates
- Client Certificates
- 选择 Add Certificates
- 设置
地址
和端口号
、CAR file
、KEY file
,证书有密码就输入Passphrase
- 测试