Keytools Https双向认证(Android通用)

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

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

Keytools Https双向认证(Android通用)_第1张图片
Keytools Https双向认证(Android通用)_第2张图片

互相信任

1.客户端信任服务器:
如果是浏览器,将服务器的证书双击,配置导入
Keytools Https双向认证(Android通用)_第3张图片
如果是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版本对应的,不然会出错!

 JDK6的下载地址: 
  http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html 


  JDK7的下载地址: 
  http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html 

  JDK8的下载地址: 
  http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。 

如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security下覆盖原来文件,记得先备份。 

如果安装了JDK,将两个jar文件也放到%JDK_HOME%\jre\lib\security下。 

你可能感兴趣的:(java安全)