1.基于SpringBoot

1.1、生成秘钥文件

(1)生成服务端秘钥库文件serve.jks

keytool -genkey -alias serve -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore serve.jks -dname CN=serve,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass jiuqi -keypass jiuqi

 导出服务端的钥库文件

keytool -export -alias serve -file serve.cer -keystore serve.jks

 (2)生成客户端的秘钥库文件client.jks:

keytool -genkey -alias client -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore client.jks -dname CN=client,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass jiuqi123 -keypass jiuqi123

导出客户端的钥库文件:

keytool -export -alias client -file client.cer -keystore client.jks

(4)把客户端的证书导入到服务端:

keytool -import -alias client -file client.cer -keystore serve.jks

(5)把服务端的证书导入到客户端:

keytool -import -alias serve -file serve.cer -keystore client.jks

为了建立连接,应该要把客户端的密钥文件给谷歌浏览器使用。因为JKS是Java的密钥文件格式,我们转换成通用的PKCS12格式如下:

(6)转换JKS格式为P12

keytool -importkeystore -srckeystore client.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass jiuqi123 -deststorepass jiuqi123 -srckeypass jiuqi123 -destkeypass jiuqi123 -srcalias client -destalias client -noprompt

成功执行完上述步骤后,会生成5个文件:

  • 服务端秘钥库文件: serve.jks
  • 服务端签名文件:serve.cer
  • 客户端秘钥库文件:client.jks
  • 客户端签名文件:client.cer

Https认证_客户端

1.2、SpringBoot配置

需要将生成的serve.jks文件放到springboot项目中的resource文件夹下,然后重启项目,就可以了。注意需要分别配置Key Store和Trust Store的文件、密码等信息,即使是同一个文件。 还需要注意的是,server.ssl.client-auth有三个可配置的值:none、want和need。双向验证应该配置为need;none表示不验证客户端;want表示会验证,但不强制验证,即验证失败也可以成功建立连接。

server.ssl.enabled=true
server.ssl.key-store-type=JKS
server.ssl.key-store=classpath:serve.jks
server.ssl.key-store-password=jiuqi123
server.ssl.key-alias=serve

server.ssl.trust-store=classpath:serve.jks
server.ssl.trust-store-password=jiuqi123
server.ssl.trust-store-provider=SUN
server.ssl.trust-store-type=JKS
server.ssl.client-auth=need

1.3、测试

(1)完成密钥文件准备和配置

启动SpringBoot项目便可以了,我这里用谷歌浏览器访问如下:

Https认证_客户端_02

然后我将生成的证书导入到浏览器中,重启浏览器继续访问测试接口,就会提示我们选择证书,点击我们导入的证书就可以正常访问了。 如何在浏览器中导入证书呢? 打开谷歌浏览器,找到设置->隐私设置和安全性->安全->管理设备证书->导入,按步骤提示导入就可以了,导入的是client.p12这个文件

(2)导入完成后再发请求,会提示选择证书

Https认证_服务端_03

选择证我们的证书后,点击确定,即可访问到服务器资源

Https认证_库文件_04

我这里显示401是因为,服务里面还加了token认证。

(3)单向认证

只需要我们将server.ssl.client-auth的值改为none就可以了,这样我们就不需要在客户端浏览器导入证书了,访问遇到警告,点击滤过继续访问就可以正常访问了

2.基于Nginx

​Nginx配置Https认证​