关于https的双向认证详解
原doc文档导出pdf
基本描述
Https是在基本的http通讯协议上增加的tls安全协议,tls安全协议需要ssl安全证书作为加解密要素,双向认证是指在客户端确认服务的是否可信任的单向认证基础上增加服务端的对客户端的认证。
主要内容
https通信协议
是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
参见 百度https百科
tls安全协议
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密
参见 百度SSL
ssl安全证书
SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能
参见 百度ssl证书
证书链
证书链的描述,证书链的可信传递机制,以及根证书的来源和查看方式
证书格式
常见证书格式和转换
https://blog.csdn.net/justinjing0612/article/details/7770301
tls认证过程
SSL认证是指客户端到服务器端的认证。主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准,即所谓的单向认证
参见 百度ssl认证
其他内容
HTTPS实战之单向验证和双向验证
https://www.jianshu.com/p/119c4dbb7225
浅谈HTTPS(SSL/TLS)原理
https://www.jianshu.com/p/41f7ae43e37b
HTTPS通信中的身份认证机制
https://blog.csdn.net/bravegogo/article/details/60766773
SSL双向认证以及证书的制作和使用-https+客户端身份验证
https://blog.csdn.net/soarheaven/article/details/78784848
X - Certificate and Key management证书管理工具
https://hohnstaedt.de/xca/index.php
ssl证书相当于安全的钥匙,如果私钥外泄被恶意盗用,会存在安全问题
双向认证的常用场景
银行网银U盾使用
专业版登录支持U盾认证多重认证
资金动账类交易U盾再次认证确认客户端身份
金融支付工具安全数字证书
支付宝数字证书app下载安装可以提高app支付安全,支付额度
常用pc安装数字证书免除重复的其他安全校验
其他对通信安全有较高要求的都可以应用此https双向认证
主要成本在于向具有CA资质的机构申请有效的证书,非CA机构的自制根证书及证书链管理需要自行负责
https应用的使用示例
工具版本说明
本地操作系统版本:win10
本地tomcat版本9
本地java版本1.8
证书管理工具xca 2.1.2
Keytool界面工具1.6
http://enkj.jb51.net:81/201703/tools/keytool_jb51.rar
前提概要
客户端和服务端角色根据通信请求来确定,客户端和服务端需要保持支持一致的TLS安全协议版本
单向认证说明
单向认证首先需要申请制作证书链
对于客户端请求服务端,比较常见的客户端是指浏览网页使用的浏览器(chrome,IE,firefox等)以及移动客户端(ios或android app),服务端一般指客户端请求目标服务的服务提供者
双向认证Java的https客户端请求
Keystool工具使用
请参考网络使用说明
依照java的keytool命令界面化工具,生成java专有的jks格式容器文件
依赖包
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
Java client demo
package com.web.ssl.twoway.ssltwoway;
import com.web.ssl.twoway.ssltwoway.Constants;
import org.apache.commons.io.IOUtils;
import org.apa