Android Https 双向认证
来源:互联网 发布:无线网网络受限怎么办 编辑:程序博客网 时间:2024/05/22 06:30
在需要做安全认证的App中,例如银行的App中,需要做服务器认证,还有App认证,只有有对应的加密锁才能访问服务器,只有对应的App才能访问服务器.关于https可以自己百度一下.我看了很多遍看了就忘.
1.首先获取两个密匙对, 这里要获取两对,一个认证手机,一个认证服务器.
E:\worktemp\各种相关项目资料\https双向认证>keytool -genkey -alias XXX_server -k
eyalg RSA -keystore Xxxx.jks -validity 3600 -storepass 123456
您的名字与姓氏是什么?
[Unknown]: jin
您的组织单位名称是什么?
[Unknown]: XXXX
您的组织名称是什么?
[Unknown]: XXXX
您所在的城市或区域名称是什么?
[Unknown]: CN
您所在的省/市/自治区名称是什么?
[Unknown]: HB
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=jin, OU=XXXX, O=XXXX, L=CN, ST=HB, C=CN是否正确?
输入 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
2.利用上面生成的jks文件来签发证书.只有有对应签发证书的客服端才能连接, 需要将上面生成的两个jks都生成对应的证书cer文件.
E:\worktemp\各种相关项目资料\https双向认证>keytool -export
-file xxxx_server.cer // 这是你要生成的证书的名字
-keystore xxxx_server.jks // 这是你要利用哪个jks去获取证书
-storepass 123456 // 这是你上面生成的jks的密码.
3.接下来配置tomcat服务器,要在服务器的配置文件中配置支持https协议.
找到tomcat/conf/sever.xml文件,并以文本形式打开。
原本的配置如下
<Connector port=”8080” protocol=”HTTP/1.1”
connectionTimeout=”20000”
maxPostSize=”0”
redirectPort=”8443” />
Caution:注意,这里是添加下面的配置,原有的配置不要改动.
<Connector SSLEnabled=”true”
acceptCount=”100”
clientAuth=”false”
disableUploadTimeout=”true”
enableLookups=”true”
keystoreFile=””
keystorePass=”123456”
maxSpareThreads=”75”
maxThreads=”200”
minSpareThreads=”5”
port=”8443”
protocol=”org.apache.coyote.http11.Http11NioProtocol”
scheme=”https”
secure=”true” sslProtocol=”TLS” />
注意keystoreFile的值为我们刚才生成的jks文件的路径:填写自己的路径就可以了.注意不要有中文最好(填写你的路径).keystorePass值为密钥库密码:123456。
如果你在此tomcat中部署了项目,即可按照如下url方式访问:
// 注意下面是8443 端口
https://ip:8443/项目名/path,没有部署也没关系,直接拿默认的主页进行测试了,拿它的html字符串。
你也可以使用默认主页测试:https://localhost:8443/
4.接下来正餐,在手机中如何访问,用上面获取到的cer文件.放到手机的raw 或者assets目录下都可以,只要你能获取到的地方,然后在初始化的类中对证书进行受信任操作.
SSLPeerUnverifiedException: Hostname 192.168.1.12 not verified: 出现这种问题解决的方案:keytool -genkey -dname "CN=192.168.1.103,OU=soft,O=xab,L=FengTai,ST=Beijing,c=cn" -validity 10000 -storepass 123456 -keypass 123456 -ext san=ip:192.168.1.103关键是:-ext san=ip:192.168.1.103 ,需要jdk1.7。下面参考依据:The HTTPS specification (RFC 2818) is quite clear about the server identity verification with an IP address: a Subject Alternative Name (IP) entry must be present in the certificate (whereas the CN in the Subject DN would suffice as a fallback solution for a host name).
使用上面的指令重新生成jks文件,重新生成证书cer.重新复制到项目中即可.
中间我出了这个问题,我把服务程序重启了.更换了英文目录.就好了.06-22 12:34:52.705: I/System.out(16494): 失败javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.Caution:电脑上的路径记得要设置成英文路径,有中文会报错.
5.上面是服务器经过认证了,下面是要对手机进行认证.
因为:Java平台默认识别jks格式的证书文件,但是android平台只识别bks格式的证书文件。
所以使用工具进行转换:转换工具下载地址
解压后,使用jave -jar portecle.jar即可打开GUI界面(Window平台)
a.可以直接将jks文件进行拖拽到当前的工具界面内
b.拖拽进去之后,然后使用Tool->Change keystore Type -> BKS
c.提示输入密码,输入之后确定提示成功.
d.选择文件.save as 输入要保存的名字:phone.bks 还有文件夹位置.结束.
// 核心代码KeyStore phoneKeystore = KeyStore.getInstance(KeyStore.getDefaultType()); phoneKeystore.load(getAssets().open("phone.jks"), "123456".toCharArray()); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(phoneKeystore, "123456".toCharArray()); KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
6.双向认证还要对服务器进行处理一下,设置cer文件.同样的使用.
设置跟上面差不多,但是有一个属性要设置成ClientAuth=true 这个属性要设置成true.
另:在服务器上不支持使用cer格式的证书,要把证书加入到jks中去.
E:\worktemp\https_jks_cer>keytool -import -alias deao_server -file phone.cer -keystore phone_client_for_server.jks输入密钥库口令:再次输入新口令:所有者: CN=jin, OU=jin, O=jin, L=WH, ST=HB, C=CN发布者: CN=jin, OU=jin, O=jin, L=WH, ST=HB, C=CN序列号: 25347795有效期开始日期: Wed Jun 22 12:26:23 CST 2016, 截止日期: Fri May 29 12:26:23 CST2116证书指纹: MD5: EA:97:9A:6E:2D:FD:F9:00:09:0E:C1:92:7F:12:AF:65 SHA1: E9:E1:BF:8F:46:1D:E1:35:DF:64:52:C5:A4:1F:D4:F7:52:B7:DB:28 SHA256: 5F:F9:0A:59:F1:38:6E:07:EE:ED:AC:E0:24:56:E3:74:D0:0A:3D:D6:C3:1B:FA:59:B7:B9:1E:7C:32:B2:2C:E7 签名算法名称: SHA256withRSA 版本: 3扩展:#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: 86 7D 30 AF 49 49 5B 2E B4 70 FC 12 07 EC 0E 5D ..0.II[..p.....]0010: 58 C8 7A A4 X.z.]]是否信任此证书? [否]: y证书已添加到密钥库中
7.生成好保存有phone.cer的jks文件,修改上面设置的标签的内容.
两处修改:1.clientAuth=”true” 属性设置成true
2.添加一个属性truststoreFile:路径设置成刚才的jks.既把phone.cer放进去生成的jks.
8.重启.
// 这是双向认证设置之后完整的配置<Connector SSLEnabled="true" acceptCount="100" clientAuth="true" disableUploadTimeout="true" enableLookups="true" keystoreFile="E:\worktemp\https_jks_cer\server.jks" keystorePass="123456" maxSpareThreads="75" truststoreFile="E:\worktemp\https_jks_cer\phone_client_for_server.jks" maxThreads="200" minSpareThreads="5" port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" sslProtocol="TLS"/>
// 使用的时候又出现了下面这个问题:
// 从字面上看出来应该是某些协议不支持,我找了一下,06-22 14:56:27.945: I/System.out(28623): 失败javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x789c2d40: Failure in SSL library, usually a protocol error06-22 14:56:27.945: I/System.out(28623): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x71849cf8:0x00000000)
上面的解决连接
目前就这样了.我修改之后忘记反正一直报这个错误,我重启了一下tomcat居然就好了.
android端源码下载
参考链接
- Android Https 双向认证
- Android Https 双向认证
- android 开启Https双向认证
- Android Retrofit HTTPS 单向认证 双向认证
- tomcat搭建android https双向认证
- 基于java的https双向认证(android)
- Android访问Https双向认证API
- Keytools Https双向认证(Android通用)
- Https双向认证Android客户端配置
- android SSL证书认证、SSL双向认证、https访问;
- android中https请求的单向认证和双向认证
- https双向认证
- https 双向认证
- HTTPS 双向认证
- https 双向认证
- HTTPS双向认证原理
- https双向认证
- tomcat https 双向认证
- cocos2d-Lua之局部变量与全局变量
- 关于eLTE,你不知道的事
- NDK r9d版本下载
- Java中QQ号的校验案例
- CRM开发总结2:BOL找字段层级关系
- Android Https 双向认证
- 0601 c语言概述
- ListView与ScrollView冲突的4种解决方案
- Java中正则表达式的分割案例
- 申请苹果开发者账号支付(没有Visa怎么办?)
- 使用MyBatis(一)使用xml配置完成查询单行数据
- ionic condova 相关环境安装
- 本地提权
- VMware里装XP 没有找到硬盘驱动器