Https认证:
单向认证:保证服务器是可信任的,可以安全的访问的!
客户端拿到服务器的证书,通过CA认证信任,然后取出公钥,加密对称密钥传给服务器,服务器用自己的私钥解密得到对称密钥,后续使用该对称密钥加解密数据!
双向认证:客户端和服务器都是可以互相信任的!
客户端向服务器发送一个请求时,服务器会把自己的证书,以及一些信息发送过来,客户端拿到服务器的证书通过CA进行验证,如果是可靠的,继续进行,如果不是可靠的,则会弹出警告,告诉客户端证书有风险。同样服务器也也要验证客户端的证书,如果没有通过验证,拒绝连接,如果两端都通过验证,则可以进行正常通信,使用对方的公钥加密对称密钥,实现安全通信!
##使用 keytool工具生成管理证书
// 生成服务器证书server.keystore
keytool.exe -genkey -v -alias server -keyalg RSA -keystore D:\home\server.keystore -validity 36500 -ext SAN=ip:192.168.1.1
// 生成客户端证书client.p12 证书格式PKCS12
keytool.exe -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\home\client.p12 -validity 36500
// 导出客户端证书client.cer
keytool.exe -export -alias client -keystore D:\home\client.p12 -storetype PKCS12 -rfc -file D:\home\client.cer
// 导出服务器证书server.cer
keytool.exe -keystore D:\home\server.keystore -export -alias server -file D:\home\server.cer -validity 36500
// 添加客户端证书为服务器的信任认知
keytool -import -v -file D:\home\client.cer -keystore D:\home\server.keystore
//查看证书 信任列表
keytool -list -keystore D:\home\server.keystore
//删除信任证书
keytool -delete -alias mykey -keystore server.keystore -storepass hz123456
实际操作步骤
1.导入生成客户端的P12到xshell
2.通过命令生成client.cer
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -rfc -file client.cer
3.加入客户端证书到服务器信任列表(server.keystore的密码是ab123456)
keytool -import -v -file client.cer -keystore server.keystore
4.查看服务器证书列表
keytool -list -keystore server.keystore
5.配置tomcat,支持双向验证(/usr/tomcat/apache-tomcat-7.0.68)
编辑tomcat服务器的配置,让其支持双向验证
vim server.xml
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" URIEncoding="UTF-8"
keystoreFile="server.keystore" keystorePass="hz123456"
truststoreFile="server.keystore" truststorePass="hz123456"
clientAuth="true" sslProtocol="TLS" />
6.关闭tomcat进程
ps aux|grep tomcat
查看tomcat进程, kill 1111
7.重启进程
进入bin目录 ./startup.sh
Android P12 BKS
Android的客户端证书是BKS格式的,所以需要将P12格式的证书转换成BKS格式,步骤如下:
1.使用portecle工具转换:
[下载链接(http://portecle.sourceforge.net/)](http://portecle.sourceforge.net/)
2.命令行打开工具:
java -jar portecle.jar
3.转换BKS
互相信任
1.客户端信任服务器:
如果是浏览器,将服务器的证书双击,配置导入
如果是Android客户端,只需要将服务器cer证书文件放入assert目录,相应解析处理,大家可以百度!
2.服务器信任客户端:
如果是浏览器,可以将客户端是证书加入到服务器的信任证书列表
如果是客户端,将bks证书放到assert目录,解析传到服务器!具体Android端怎么读取bks证书传给服务器的,大家可以下去研究一下!
注意:坑
1.生成证书的时候,要指定ip
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500
注意:first last name需要指定如下
-ext SAN=ip:xxx.xxx.xxx.xxx
2.P12 BKS 转换的时候密码过长,报错
java.security.KeyStoreException: java.io.IOException: Error initialising store of key store: java.security.InvalidKeyException: Illegal key size
是国外对技术出口的限制,限定了密钥的长度,需要替换jdk里面的两个文件(jre\lib\security):local_policy.jar,US_export_policy.jar,要下载jdk版本对应的,不然会出错!