您的位置:首页 > 理论基础 > 计算机网络

Android Https 双向认证

2016-06-22 13:19 603 查看
在需要做安全认证的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 -ke
ystore 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 CST
2116
证书指纹:
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=false
SubjectKeyIdentifier [
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 error
06-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