本文共 5441 字,大约阅读时间需要 18 分钟。
Https 是在 Http 的之下加入了SSL (Secure Socket Layer),安全的基础就靠这个SSL,SSL 位于 TCP/IP 和HTTP协议之间,其作用:
1> 认证用户和服务器,确保数据发送到正确的客户机和服务器 -> 验证证书
3> 维护数据的完整性,确保数据在传输过程中不被改变 -> 摘要算法
Https 在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息,握手过程的简单描述如下:
1> 浏览器将自己支持的一套加密算法、HASH算法发送给网站
2> 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息
3> 浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥,然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站
4> 网站接收浏览器发来的数据之后,通过私钥进行解密,然后HASH校验,如果一致,则使用浏览器发来的数字串使加密一段握手消息发给浏览器
5> 浏览器解密,并HASH校验,没有问题,则握手结束。接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输
服务器端会有一个证书,在交互过程中客户端需要去验证证书的合法性,对于权威机构颁发的证书当然会直接认为合法。对于自己造的证书,那么就需要去校验合法性了,也就是说只需要让OkHttp Client去信任这个证书就可以畅通的进行通信了。对于自签名的网站的访问,网上的部分的做法是直接设置信任所有的证书,对于这种做法肯定是有风险的
证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书。如果以后真正在产品环境中使用肯定要去证书提供商去购买,也有免费的
CSR(Certificate Signing Request) : 数字证书签发申请
Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:
1> 密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密)
2> 可信任的证书实体(trusted certificate entries)-只包含公钥.
-genkey 在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录)
-alias 产生别名 每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
-keyalg 指定密钥的算法 (如 RSA DSA,默认值为:DSA)
-validity 指定创建的证书有效期多少天(默认 90)
-storepass 指定密钥库的密码(获取keystore信息所需的密码)
-keypass 指定别名条目的密码(私钥的密码)
-dname 指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码”
-list 显示密钥库中的证书信息 keytool -list-v -keystore 指定keystore -storepass 密码
-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore – storepass 密码
-printcert 查看导出的证书信息 keytool -printcert -file g:\sso\michael.crt
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
-storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密码) -new pwdnew(新密码)
-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书
Mac : /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/bin
> cd /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/bin > keytool -genkey -alias server -keyalg RSA -keystore /Users/chenshun131/Desktop/server.keystore -validity 3650 -dname "CN=chenshun131.com, OU=chenshun, O=develop, L=gz, ST=gd, C=zh" -keypass 123456 -storepass 123456 > keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore /Users/chenshun131/Desktop/client.p12 -dname "CN=chenshun131.com, OU=chenshun, O=develop, L=gz, ST=gd, C=zh" 把客户端证书添加到服务器的信任认证。由于不能直接将PKCS12格式的证书导入,必须先把客户端证书导出为一个单独的CER文件
> keytool -export -alias client -keystore /Users/chenshun131/Desktop/client.p12 -storetype PKCS12 -storepass 123456 -rfc -file /Users/chenshun131/Desktop/client.cer 将 .cer文件导入到服务器的证书库,添加为一个信任证书
注:如果你的网站规定每人一个证书,而不是一个公司一个证书,那么可以重复前几步,把每个人的证书添加到服务器中 > keytool -import -v -file /Users/chenshun131/Desktop/client.cer -keystore /Users/chenshun131/Desktop/server.keystore > keytool -importcert -trustcacerts -file /Users/chenshun131/Desktop/client.cer -keystore /Users/chenshun131/Desktop/client.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /Users/chenshun131/Desktop/bcprov-jdk15on-146.jar -storepass 123456 通过list命令查看服务器的证书库,可以看到两个证书,一个服务器证书,一个受信任的客户端证书
> keytool -list -keystore /Users/chenshun131/Desktop/server.keystore 把服务器证书导出为一个单独的 .cer文件,来签发证书
> keytool -keystore /Users/chenshun131/Desktop/server.keystore -export -alias server -file /Users/chenshun131/Desktop/server.cer 双击 .cer文件,按照提示安装证书,将证书设置始终信任
protocol="org.apache.coyote.http11.Http11NioProtocol"
keystoreFile="/Users/chenshun131/Desktop/server.keystore"
truststoreFile="/Users/chenshun131/Desktop/server.keystore"
truststorePass="123456” />
注 : clientAuth 要是本地测试最好设置成 false 在输入完密码后提示输入域名是输入的是chenshun131.com,其实这个域名是不存在的,但是为了演示所以虚拟了这个域名,技巧在于修改
Windows : C:\Windows\System32\drivers\etc\hosts
127.0.0.1 chenshun131.com
这样在访问 sso.wsria.com的时候其实是访问的127.0.0.1也就是本机
对于 Chrome 进入设置,点击 HTTPS/SSL 的证书管理
双击 .p12文件,按照提示安装证书,将证书设置始终信任
此时启动服务器,访问 这个Tomcat工程,就是 Https
使用 okhttp 连接,在程序初始化时加载 .bks 文件
1> keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
此时需要注意在目标目录中不要存在 .keystore,另外注意输入默认保护密码 changeit
2> keytool 错误: java.io.FileNotFoundException: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib/security/cacerts (Permission denied)
这是由于权限不够需要使用 sudo,使用此命令需要在第一次输入系统密码
3> java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
4> 启动会报错:Java.io.IOException: Wrong version of key store.
Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件