HTTPS双向验证在实际项目中的使用
目录
HTTPS实际应用场景
https双向验证原理,请自行查找,简单来说,服务端与客户端交互式时,要对客户端进行身份验证。这里的客户端和服务端没有严格区分。可视为请求发起方为客户端,接收方为服务端。
简单的理解,在一个单向通讯时:
客户端向服务器发送请求时,服务端需要验证客户端的证书。
而客户端需要信任服务端的证书。此时需要客户端和服务端各提供一个证书。
两个系统角色互换,则需要另外两个证书, 所以在双向的通讯中总共需要4个证书,双方各两个。(当然也可以客户端、服务端证书一起用,这时双方各一个,相当于你作为客户端和服务端时的证书相同;也可以配置不校验客户端证书等等,)。
双向验证在Springboot中的配置
#这个证书一会我们自己签发
server.ssl.key-store=classpath:server.p12
server.ssl.key-store-password=pwd
server.ssl.keyStoreType=PKCS12
# 开启双向验证 即对客户端的证书也需要校验
server.ssl.client-auth=need
# 通讯连接时会在信任库中检查对方证书是否我们信任
server.ssl.trust-store=classpath:truststore.keystore
server.ssl.trust-store-password=pwd
server.ssl.trust-store-type=JKS
若单向认证,则删除这项配置:
#检验客户端证书
server.ssl.client-auth=need
单向认证相当于给系统加了一个安全保护,报文密文传输,防劫持等等。访问时需要改为https://xxx.xxx.xxx.xxx
若自签证书则会提示
说明我们的证书不是权威机构颁发的。点击高级信任它就好。
发送httpsPost请求
网上代码很多,随便找,这边提供一个工具类
public class HttpsUtils {
// 主秘钥绝对路径,这些参数都是绝对路径,配置化即可
private static final String keystore = "D:\\https-demo\\src\\main\\resources\\server.keystore";
// 主密钥密码
private static final String keystorePassword = "pwd";
// 信任密钥绝对路径
private static final String truststore = "D:\\https-demo\\src\\main\\resources\\server.keystore";
// 信任密钥密码
private static final String truststorePassword = "pwd";
private static SSLContext sslContext