https握手
http的握手过程:
HTTPS握手过程
流程分析:
1. 客户端发起HTTPS请求
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以是自己制作或者CA证书。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用CA证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。公钥给别人加密使用,私钥给自己解密使用。
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等。
4. 客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值,然后用证书对该随机值进行加密。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8. 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。
RSA加密算法
加密算法链接:
https://blog.csdn.net/sunmenggmail/article/details/11994013
HTTPS
HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS:
由认证机构(CA,根证书颁发机构)签发 的数字证书中,存储着公钥,户的身份跟公钥链接在一起,证书的用户身份是唯一的。
(server端)自签发数字证书步骤如下:
Step1 生成自己的CA根证书
生成CA私钥文件ca.key:
openssl genrsa -out ca.key 1024
生成X.509证书签名请求文件ca.csr:
openssl req -new -key ca_private.key -out ca.csr
在生成ca.csr的过程中,会让输入一些组织信息等。
生成X.509格式的CA根证书ca_public.crt(公钥证书):
openssl x509 -req -in ca.csr -signkey ca_private.key -out ca_public.crt
Step2 生成服务端证书
先生成服务器私钥文件server_private.key:
openssl genrsa -out server_private.key 1024
根据服务器私钥生成服务器公钥文件server_public.pem:
openssl rsa -in server_private.key -pubout -out server_public.pem
服务器端需要向CA机构申请签名证书,在申请签名证书之前依然是创建自己的证书签名请求文件server.csr:
openssl req -new -key server_prviate.key -out server.csr
流程:
生成(CA文件 ca.key) --->X.509证书签名(ca.csr)--->X.509格式的CA(ca_public.crt(公钥证书))
服务器私钥文件(server_private.key)--->服务器公钥文件(server_public.pem)--->证书签名请求文件()(server.cs)
app 端需要校验的地方:
如何校验:
Webview的HTTPS安:
WebViewClient的onReceivedSslError() ,
如果出现证书错误,直接调用handler.proceed()会忽略错误继续加载证书有问题的页面,
如果调用handler.cancel()可以终止加载证书有问题的页面,证书出现问题了,可以提示用户风险,
让用户选择加载与否,如果是需要安全级别比较高,可以直接终止页面加载,提示用户网络环境有风险。