http://frank-zhu.github.io/android/2014/12/26/android-https-ssl/
http://www.iyanran.com/blog/articles/2016/01/26/1453806487917.html
最近做android项目,用到了https的双向认证方面的知识,以为会很难,其实最后发现也挺简单的,记录如下。
一、HTTPS和HTTP的区别
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
二、SSL功能
1)客户对服务器的身份认证:
SSL服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性。
2)服务器对客户的身份认证:
也可通过公钥技术和证书进行认证,也可通过用户名,password来认证。
3)建立服务器与客户之间安全的数据通道:
SSL要求客户与服务器之间的所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
三、生成密钥库和证书
可参考以下密钥生成脚本,根据实际情况做必要的修改,其中需要注意的是:服务端的密钥库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意。
1、生成服务器证书库
keytool -validity 3650 -genkey -v -alias server -keyalg RSA -keystore server.keystore -dname "CN=127.0.0.1,OU=fhpt,O=fhpt,L=Wuhan,ST=Hubei,c=cn" -storepass liujing -keypass liujing
2、生成客户端证书库
keytool -validity 3650 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname "CN=client,OU=fhpt,O=fhpt,L=Wuhan,ST=Hubei,c=cn" -storepass liujing -keypass liujing
3、从客户端证书库中导出客户端证书
keytool -export -v -alias client -keystore client.p12 -storetype PKCS12 -storepass liujing -rfc -file client.cer
4、从服务器证书库中导出服务器证书
keytool -export -v -alias server -keystore server.keystore -storepass liujing -rfc -file server.cer
5、生成客户端信任证书库(由服务端证书生成的证书库)
keytool -import -v -alias server -file server.cer -keystore client.truststore -storepass liujing
6、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)
keytool -import -v -alias client -file client.cer -keystore server.keystore -storepass liujing
7、查看证书库中的全部证书
keytool -list -keystore server.keystore -storepass liujing
四、服务端tomcat配置
使用文本编辑器编辑${catalina.base}/conf/server.xml
找到Connector port="8443"的标签,取消注释,并修改成如下:
1 2 3 4 5 |
|
keystoreFile:指定服务器密钥库,可以配置成绝对路径,如“D:/key/server.keystore”,本例中是在Tomcat目录中创建了一个名称为key的文件夹,仅供参考。
keystorePass:密钥库生成时的密码
truststoreFile:受信任密钥库,和密钥库相同即可
truststorePass:受信任密钥库密码
五、服务端web访问
服务器做如上的配置之后,web是没法访问的,因为服务器不信任客户端,所以必须把client.p12添加到本地的证书库中。双击client.p12即可。
添加之后,浏览器提示是否使用证书:
确定之后,正常访问web,不过浏览器并不信任服务器:
配置之后,本地可以访问服务器了,但是,本地的浏览器并不信任服务器,虽然也可以访问,但是还是不太完美,将server.cer添加到证书库中就可以了,至此,服务器的双向验证基本完成。
六、android端实现
通过上面的步骤生成的证书,客户端需要用到的是client.p12(客户端证书,用于请求的时候给服务器来验证身份之用)和client.truststore(客户端证书库,用于验证服务器端身份,防止钓鱼)这两个文件.其中安卓端的证书类型必须要求是BKS类型
一般客户端验证SSL有两种方式,一种是通过SSLSocketFactory方式创建,需要设置域名及端口号(适应于HttpClient请求方式),一种是通过SSLContext方式创建(适用于HttpsURLConnection请求方式)。
以下给出Android端的请求:
1、下面给出SslSocketFactory方式进行SSL认证的客户端代码
|
2、下面给出SSLContext方式进行SSL认证的客户端代码
|
七、bks文件的生成
keytool -importcert -v -trustcacerts -alias test -file client.cer -keystore test.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath ./bcprov-jdk15on-146.jar -storepass liujing
至此,所有的步骤都介绍完成,bcprov-jdk15on-146.jar的下载链接点击这里
本网站的客户端证书和服务器信任证书下载地址
访问8443端口即可测试哦~
本文内容部分转载于:http://frank-zhu.github.io/android/2014/12/26/android-https-ssl/ http://www.blogjava.net/icewee/archive/2012/06/04/379947.html