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端源码下载

参考链接

1 0
原创粉丝点击