前言:
CA认证机构默认给150多个网站做了安全认证,也就是说有150多个证书是合法的,要想得到一个合法签名证书,需要到CA认证机构获取,但个人认为这并没有神马卵用(只是浪费钱,12306用的就是自己签名的证书),只是在浏览器访问时,不再提示非法网址罢了,而我们自己创建的网址,对客户端严格来说,是需要双向验证客户端和服务器的证书的。HTTPS也是为此而生的,Https的每次请求连接,都需要经过三次握手,其实就是对客户端和服务器是否正确的校验,握手成功后才会发送数据;HTTPS是HTTP的之下加入了SSL(Secure Socket Layer),安全的基础就靠这个SSL(可理解为签名证书)了,SSL/TLS证书包含身份识别(common name)和公钥,所以要生成SSL/TLS证书这里需要准备这两个东西。
ssl作用 :
- 认证用户和服务器,确保数据发送到正确的客户机和服务器;(验证证书)
- 加密数据以防止数据中途被窃取;(加密)
- 维护数据的完整性,确保数据在传输过程中不被改变。(摘要算法)
使用:
采用HTTPS协议的”服务器”必须要有一套数字证书(CA),可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,若客户端为看到有验证的代码,则很可能服务器用的是受信机构颁发的证书,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。
什么是自签名证书?
就是没有通过受信任的证书颁发机构, 自己给自己颁发的证书.自签名证书怎么生成?
KeyTool 生成自签名证书:
- 服务器生成证书:
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/keys/tomcat.keystore -storepass 123456
- 服务器生成证书:
客户端生成证书:
keytool -genkey -alias client1 -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore D:/keys/client1.p12 -storepass 123456让服务器信任客户端证书:必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
keytool -export -alias client1 -keystore D:/keys/client.p12 -storetype PKCS12 -keypass 123456 -file D:/keys/client.cer(CER文件的密码可能需要重新输入)然后将两个文件导入到服务器的证书库,添加为信任证书:keytool -import -v -file D:/keys/client.cer -keystore D:/keys/tomcat.keystore -storepass 123456
补充:
- 所有公钥证书都有两种格式:纯文本的.crt格式或是二进制的.cer格式,两种都可以用。将生成的文件.keystore 复制到项目路径 /androidappdir/res/raw/ 中;
- 两种证书的生成用的是默认的公钥私钥,新的公钥和私钥的生成方法:若安装了git,点开git->Git Bash输入ssh-keygen,然后一直点回车,这样就会在c/Users/Administrator/.ssh中生成两个文件:id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥;
- 查看”签名文件”信息方法:
在dos或Terminal中的输入(jdk中的keytool)命令:
keytool -v -list -keystore keystore绝对路径,或直接进入到目录下在dos或Terminal中执行:
keytool -v -list -keystore debug.keystore
如何实现Https的签名验证功能呢?
- okhttp3方式:
new OkHttpClient.Builder().sslSocketFactory(getSSLSocketFa