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
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项目便可以了,我这里用谷歌浏览器访问如下:
然后我将生成的证书导入到浏览器中,重启浏览器继续访问测试接口,就会提示我们选择证书,点击我们导入的证书就可以正常访问了。
如何在浏览器中导入证书呢?
打开谷歌浏览器,找到设置->隐私设置和安全性->安全->管理设备证书->导入,按步骤提示导入就可以了,导入的是client.p12这个文件
(2)导入完成后再发请求,会提示选择证书
选择证我们的证书后,点击确定,即可访问到服务器资源
我这里显示401是因为,服务里面还加了token认证。
(3)单向认证
只需要我们将server.ssl.client-auth的值改为none就可以了,这样我们就不需要在客户端浏览器导入证书了,访问遇到警告,点击滤过继续访问就可以正常访问了
2.基于Nginx
Nginx配置Https认证