关键字:双向认证、数字签名、加密、TLS、mutual TLS、信任库、truststore
1. 相关概念:
证书:证书包括 域名 公钥 签名
证书链:根证书是可以自己给自己验证真伪的,其他的证书都需要他的上级签发机构的证书中的公钥才能验证证书的真伪的,是一种递归验证方式的。
数字签名:使用私钥加密公钥和域名的hash值产生的一个电子签名,本质就是hash运算结果的加密。
验签:使用公钥解密签名,然后比对域名和公钥的hash值是否一致。
加密:使用公钥加密,私钥解密。与数字签名相反。
特别说明:
在签名时,私钥加密,公钥解密,在加密时,公钥解密,私钥解密。
2. 双向认证原理:
2.1证书验证过程:
客户端验证服务器证书的过程:
- 客户端先从服务器证书中提取域名和公钥,并进行hash运算,得到hash值。
- 尝试根据truststore或者系统证书链与server.crt构建证书信任链,使用上级证书里面的公钥来解密server.crt中签名,得到hash值,判断这个hash值是否与第一步得到的hash值一致,如果一致,就认为证书没被篡改同时也会做一些如有效期等验证,都验证通过之后,确定证书是否可用。
特别说明:
- 一般server端的证书都是知名机构签发的,所以他们的证书都是在系统级别可以直接找到他的上级签发机构的,一般不用配置truststore如果server端的证书是自签的,则需要添加truststore.
- truststore包括: 最低端的中间证书+...+根证书,当然最低端的证书也可以包括服务器自己的证书。
- 服务器端验证客户端证书的过程类似,一般客户端的证书都是自签的,所以都要配置truststore,如果客户端也是知名机构签发的证书可以只上传客户端自己的证书作为truststore,他会结合系统的证书构建成信任链的。
- 如果自签证书被人工添加到系统的信任里面去之后,也可以与知名机构签发的正式一样使用,truststore也可以只配置客户端自己或者服务器端的证书,它也会结合系统的信任证书去构建信任链。
3.实践:
3.1server端配置:
不同云平台会不一样,都需要配置truststore和server端证书的。
truststore:证书信任库,如果客户端是知名CA签发的证书,就只上传客户端自己的证书就行了,如果是自签证书,那需要把中间证书,根证书合并到一起放在一个pem文件中上传。
server端证书:可以使用云平台自己的证书管理签发或者购买证书配置到网关或者NGINX上,自签证书可以自己搜索一下怎么配置ssl证书就行了。
3.2client端配置:
不同的客户端工具是不一样的,使用代码的话,可以自行百度不同语言的ssl怎么配置。
这里只大概说一下apifox工具如何配置证书:
- 私钥:私钥使用解密的私钥比较方便,命令行解密私钥,然后上传给客户端
- 证书:证书可以是pem文件,但是要注意需要删除证书里面的私钥相关的信息,否则的话会不识别的。
- truststore:信任库,如果server端的证书是知名ca签发的,这里可以不配置,如果是自签的,需要把自签的整个证书链凭借到一个pem文件中上传。当然也可以把证书添加到系统信任库,这样这里也可以不配置。