数据通信 系列目录
- 网络通信之——RSA加密签名
- 网络通信之——Https数字证书
- 网络通信之——SSL与TLS
- 数字证书中签名算法、签名哈希算法区别?
数字证书
- 前言
- 证书构成
- 证书的发布及使用流程
- Android开发中的运用
- 总结
博客创建时间:2020.05.11
博客更新时间:2021.02.23
前言
TLS
TLS证书信任,就是从用户证书到中间证书,再到根证书,这样一个溯源的过程,浏览器需要找到道受信任的根证书,才会信任你的证书。
TLS(传输层安全)是更为安全的升级版 SSL。由于 SSL 这一术语更为常用,因此我们通常仍将安全证书称作 SSL。TLS 证书一般有ECC、RSA 或 DSA 三种加密方式可以选择,RSA加密只是其中一种方式
数字证书可以确认其内含的公钥确实是这个证书的所有者(Subject)的,或者证书可以用来确认对方的身份。也就是说,我们拿到一个数字证书,我们可以判断出这个数字证书到底是谁的。
确保了证书的安全可靠才能确保,Https通信传递信息的安全可靠。
证书构成
先通过google浏览器查看百度翻译的数字证书
主要的几个参数:
1. Issuer CA (证书的发布机构)
指出什么机构颁发的证书,即证书创建者。截图中是 TrustAsia TLS RSA CA这个证书颁发机构。
在证书的发布机构发布证书时,证书的指纹和指纹算法都会加密后再和证书放到一起发布,以防有人修改指纹后伪造相应的数字证书。这里的是用发证机构自己的私钥进行加密的
用户获得数字证书后,可以用证书发布机构的公钥(RSA算法)对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他自己本身也有自己的证书。
注意
证书发布机构的证书在我们安装操作系统时,数字证书就已经安装在电脑中了。微软等操作系统开发商会根据一些权威机构的评估选取信誉较好且通过安全认证的证书发布机构,将他们的证书默认安装在系统中。证书机构持有自己数字证书对应的私钥,通过这个私钥加密他发布的证书的指纹(证书hash值) 作为证书的数字签名。
证书有效期: 有效期一般12个月起
证书使用者:这里是fanyi.baidu.com
2. 指纹
证书发布之前会对对证书进行Hash值计算,然后继续用证书签名算法和私钥对hash值进行加密获得结果为指纹
3. 证书格式RSA
RSA一种非对称的加密方法
4. 证书有效期
证书的有效开始时间到截止时间,有效期一般12个月起
5. 证书使用者(Subject )
这里是fanyi.baidu.com,一般是指申请证书的网站域名
6. 公钥
2048bits的16进制的数组数据,公钥进行server数据的解密
7. 签名算法(Signature algorithm)
截图中采用的是sha256RSA算法, 指的是这个证书的数字签名加密算法。当client从server中获取到加密数据,通过该算法和公钥解密后获取加密的数字签名数据,其内含通信数据的hash值。专用于防止传输过程中,内容信息和签名hash一起被篡改
证书发布机构CA,会使用数字证书的签名算法对证书进行加密,一般电脑系统会自带CA的证书,该证书中有公钥和签名算法用于解密办法
加密信息是证书机构用签名算法的私钥进行加密的,其签名算法和公钥用于解密颁发的证书(如 百度公司颁发的证书)。
8. 签名哈希算法(Signature hash algorithm)
又称指纹算法,截图中采用的是sha256算法,通过该算法可以对信息内容进行hash值V2得计算。对比签名算法解密获得的Hash值V1,如果V1与V2一致则信息内容未被修改过,反之亦反。
在证书的发布过程中,发布者会根据指纹算法(一种hash算法)算出整个证书的hash值(指纹),并将指纹和指纹算法放在证书中。hash值是通过签名算法的私钥进行加密的,所以想要获得证书中自带的hash值,需要使用签名算法和公钥解密获得自带的hash值。
签名算法是为了确保指纹hash值得准确性,即是为了验证内容信息的指纹值传递的和自我计算出来的指纹值一致,确保内容信息未被篡改过。
**
证书的发布及使用流程
信息传递验证
在验证完证书安全可用后,服务端和客户端就各自掌握证书的私钥和公钥达到了加密通信要求。例如某网站向客户端发送信息"*************",先验证hash值一致,然后客户端通过签名算法和公钥就能解密出传递的信息,同理服务端收到客户端发送的消息后,验证完hash值一致后根据签名算法和私钥就能解密出传递的信息。
证书的Subject判定
数字证书可以保证数字证书里的公钥确实是这个证书的所有者(Subject)的,或者证书可以用来确认对方的身份。
我们为什么能判定证书的Subject呢?
- 拿到数字证书放入电脑或移动端后,根据证书的CA名字找到对应证书发布机构的数字证书(含公钥和签名算法),进行数字签名解密。
- 通过发证机构的公钥进行解码获取该证书的指纹和指纹算法,然后通证书的签名算法和公钥解密指纹,拿到证书的hash值;通过指纹算法再次计算该证书的指纹获取真实指纹hash值,如果证书包含的指纹和真实指纹一致,则说明证书未被篡改过,证书真实可靠,那么证书中的subject真实可靠。
Android开发中的运用
在Android软件与后台服务器进行通信过程中,为了数据的安全,常采用证书锁定方案。
证书锁定
用来限制哪些证书和证书颁发机构是可信任的。需要我们直接在代码中固定写死使用某个服务器的证书,然后用自定义的信任存储去代替系统系统自带的,再去连接我们的服务器,我们将这种做法称之为证书锁定。
换言之,证书锁定就是在代码中验证当前服务器是否持有某张指定的证书,如果不是则强行断开链接。
证书锁定好处:
- 增加软件破解难度
- 省了购买证书的费用。
Android中的证书分类
- 由android认可的证书颁发机构或者该结构下属的机构颁发的证书,比如Symantec,Go Daddy等机构,约150多个。更多的自行在手机“设置->安全->信任的凭据”中查看
- 没有被android所认可的证书机构所颁发的证书
- 自己颁发的证书
这三类证书中,只有第一种在使用中不会出现安全提示,不会抛出异常。
在开发中如果想用自签名的证书,客户端不信任服务器,会抛出异常:javax.net.ssl.SSLHandshakeException。
为此,我们需要自定义信任处理器(TrustManager)来替代系统默认的信任处理器,这样我们才能正常的使用自定义的正说或者非android认可的证书颁发机构颁发的证书。
自签名证书设置
- 将证书添加到工程中(放在res/raw目录或assets目录下)
- 自定义信任管理器TrustManager
- 用自定义TrustManager代替系统默认的信任管理器
java本身支持的证书格式jks,但是遗憾的是在android当中并不支持jks格式正式,而是需要bks格式的证书,因此需要将jks转成bks格式证书。
这里说的是证书不是签名文件的jks,概念不要弄混了
总结
- 证书由专业发证机构颁发,由多种信息参数如使用者、有效期、签名算法等多种信息组成。
- 证书公钥是为了对传递的信息进行RSA解密获取加密指纹和指纹算法
- 证书在发布之前会对证书进行获得Hash值的指纹计算,将Hash值继续加密后得到指纹。
- 签名算法是为了加密原始证书指纹,确保源信息指纹不会被篡改。
- 指纹及指纹算法和签名算法有区别,但是他们的区别是指纹及指纹算法是为了确保证书的安全可靠性。 签名算法是为了确保传递的信息安全可靠。
相关链接:
- 网络通信之——RSA加密签名
- 网络通信之——Https数字证书
- 网络通信之——SSL与TLS
- 数字证书中签名算法、签名哈希算法区别?
扩展链接:
- Android CameraX 使用入门
- ART与Dalvik、JVM之间的关系你懂了吗?
扩展训练:
- 了解 CA 证书的用途 ?
博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !