为什么需要双向认证
Https保证的是信道的安全,即客户端和服务端通信报文的安全。但是无法保证中间人攻击,所以双向认证解决的问题就是防止中间人攻击。
中间人攻击(Man-in-the-MiddleAttack)简称(MITM),是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。若没有开启双向认证,中间人可以拦截客户端发送的请求,然后篡改信息再发送到服务端;中间人也可以拦截服务端返回的信息,再发送到客户端。所以使用Https的单向认证或双向认证能够有效防止中间人攻击。
注:无论Ca证书还是自签证书都需要双向认证。
双向认证原理
1、服务端认证客户端原理
客户端有自己的bks证书auth_client.bks
,并将导出的auth_client_pub.cer
证书导入到服务端证书auth_server.keystore
中,这样服务端就将客户端证书添加到信任列表中,从而能够让带有该auth_client_pub.cer
证书信息的客户端访问服务。
2、客户端认证服务端原理
服务端有自己的证书(ca颁发的或者是自己创建的)auth_server.keystore
,并导出auth_server_pub.cer
证书,将该证书导入到客户端证书
auth_truststore.jks
中,注意:这里不是导入到auth_client.jks
中,而是导入生成另一个证书auth_truststore.jks
,最后再将jks证书转化成bks证书。
实现过程
一、服务端证书
创建服务端证书
keytool -genkeypair -alias auth_server -keyalg RSA -validity 36500 -keypass auth_server -storepass auth_server -keystore /Users/renzhongrui/android/certs/auth_server.keystore
导出服务端证书公钥
keytool -export -alias auth_server -file /Users/renzhongrui/android/certs/auth_server_pub.cer -keystore /Users/renzhongrui/android/certs/auth_server.keystore -storepass auth_server
二、客户端证书
创建客户端证书(andoird不能用keystore格式的密钥库,所以先生成jks格式,再用Portecle工具转成bks格式)
keytool -genkeypair -alias auth_client -keyalg RSA -validity 36500 -keypass auth_client -storepass auth_client -keystore /Users/renzhongrui/android/certs/auth_client.jks
导出客户端证书公钥
keytool -export -alias auth_client -file /Users/renzhongrui/android/certs/auth_client_pub.cer -keystore /Users/renzhongrui/android/certs/auth_client.jks -storepass auth_client
三、证书交换
将客户端证书导入服务端keystore中,再将服务端证书导入客户端auth_truststore中, 一个keystore可以导入多个证书,生成证书列表。
将客户端公钥导入到服务端keystore证书中,使得服务端能够信任客户端。
keytool -import -v -alias auth_client -file /Users/renzhongrui/android/certs/auth_client_pub.cer -keystore /Users/renzhongrui/android/certs/auth_server.keystore -storepass auth_server
生成客户端信任证书库auth_truststore.jks,即将服务端公钥导入到客户端jks证书中,使得客户端能够信任服务端。
keytool -import -v -alias auth_server -file /Users/renzhongrui/android/certs/auth_server_pub.cer -keystore /Users/renzhongrui/android/certs/auth_truststore.jks -storepass auth_truststore
最后验证一下,查看证书库中的所有证书
keytool -list -keystore /Users/renzhongrui/android/certs/auth_server.keystore -storepass auth_server
keytool -list -keystore /Users/renzhongrui/android/certs/auth_truststore.jks -storepass auth_truststore
四、证书转换
下载portecle.jar,解压后运行jar包:
java -jar portecle.jar
1、点击File菜单选择Open Keystore File
,选择创建好的auth_client.jks
或auth_truststore.jks
证书,输入密码。
2、选中导入的证书,点击Tools菜单,选择Change Keystore Type
,再选择BKS类型,再次输入密码,确认之后,会显示成功。
3、最后点击File菜单,选择Save Keystore File As,将证书保存的指定路径。
五、配置服务
证书准备好之后,就可以进行集成测试了,服务使用Spring Boot创建或者使用Nginx代理。
使用Spring Boot服务
1、添加配置
server:
port: 443
server:
tomcat:
uri-encoding: UTF-8
# 开启https,配置跟证书对应
ssl:
key-store: classpath:auth_server.keystore
key-store-type: JKS
key-store-password: auth_server
key-password: auth_server
key-alias: auth_server
enabled: true
#是否需要进行认证
client-auth: need
protocol: TLS # 默认
trust-store: classpath:auth_server.keystore
trust-store-password: auth_server
trust-store-type: JKS
2、添加代码,这里配置80端口重定向到443,也可以改成别的端口。
public class PackApplication implements WebMvcConfigurer {