当前位置:操作系统 > 安卓/Android >>

android ssl验证、https验证

准备知识:
 
Keytool工具的使用。
在用Android平台上使用SSL,第一步就是生成证书。
 
1、证书的生成
 
1.1生成服务器端的证书py
 
keytool -genkey -alias test -keystore test.jks  
1.2 将keystore中的cert导出来,用来生成客户端的验证证书
[html]  
keytool -exportcert -alias test -file test.cert -keystore test.jks  
1.3 生成Android平台的证书
因为Android 要求要BC证书,而Java的keytool本身不提供BKS格式,因此要自己手动配置。个人在配置的过程到了文件正在使用中,保存失败的情况,我的做法是将文件备份一下,用unlocker删除后将修改好备份放到原位置就好了。
 
1.3.1 下载 bcprov-ext-jdk15on-146.jar 
 
到官网下载本地jdk对应的jar,复制到C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext
 
1.3.2 配置bcprov
 
在 jdk_home\jre\lib\security\目录中找到 java.security 在内容增加一行(数字可以自己定义)
 
 
[html]  
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider  
1.3.3 生成android平台的证书
 
[html] 
keytool -importcert -keystore test.bks -file test.cert -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider  
 
一、什么是SSL?
  SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
  SSL/TLS协议位于HTTP协议与传输层协议之间,采用公钥技术,为两个应用间的通讯提供加密、完整性校验以及身份认证。
SSL协议提供了三个功能:
使用公钥证书对双端进行认证(一般仅进行服务器认证,客户端认证为可选)
通信加密(Confidentiality)
数据完整性检查(Data integrity)
 
二、SSL握手
  SSL会话以称之为SSL握手的一系列消息交换开始,在握手过程中服务器通过公钥技术向客户端认证自身(可选,客户端向服务器认证自身),客户端和服务器协商加密消息的对称密钥,SSL会话握手后的消息都使用对称密钥加密后传输,对称密钥还用于消息完整性检查。
 
 
 
 
 
Client->Server ClientHello
Client向Server发送一个“ClientHello”消息,说明它支持的密码算法列表、压缩方法及最高协议版本,以及稍后将被使用的随机数
Version: 客户端支持TLS协议最高版本号(最高3.3)
RandomNumber:客户端产生的28byte随机数,后续用作加密种子。
CipherSuites 客户端支持的加密算法和密钥大小列表
CompressionMethods 客户可支持的压缩算法
Server->Client ServerHello
服务器向客户端发送“ServerHello”消息,包含服务器选择的密码算法、压缩方法、协议版本以及服务器产生的随机数。
Version: 选择的TLS版本号
RandomeNumber:服务器产生的28字节随机数,后续用作加密种子
CipherSuite: 选择的加密算法和密钥大小。
CompressionMethod: 选择的数据压缩算法
Server->Client Certificate
Server向Client发送自身的证书链,证书链从服务器的公钥证书(public-key
certificate)开始一直到CA的根证书(certificate
authority’s root certificate).
客户端需要对server的证书链进行验证,如果验证不通过,则终止连接。若验证通过,则可从server的公钥证书中获取到server的公钥。验证流程见后续介绍。
Server->Client CertificateRequest
如果Server需要认证Client,则发送此消息请求Client的公钥证书,此消息为可选。消息中包含
Certificate Types: Server可接收的证书类型列表
DistinguishedNames: Server可接收的CA DN列表。
Server->Client ServerHelloDone
Server发送此消息通知Client已完成了初始化协商消息。
Client->Server Certificate
如果Server请求了Client的证书,即存在消息4,则client将自身的证书链信息发送给Server。Server要对Client的证书链进行验证,如果验证不通过,则终止连接,如果验证通过则可从Client的公钥证书中获取到Client的公钥。验证流程见后续介绍.
Client->Server ClientKeyExchange
Client向Server发送premaster secret,并且用Server的公钥加密。premaster secret用于双方计算出对后续消息加密的对称密钥. 使用Server的公钥加密的目的是确认Server具有消息3中所生成公钥证书的私钥,避免发送给伪造的服务器。
Client->Server CertificateVerify
如果Server请求了Client的证书,则还需要发送CertificateVerify消息,Client将到现在为止发送和接收到的握手消息,使用Client的私钥进行签名发送给Server,用于向Server证明其有消息6中声称Client公钥的私钥数据。Server可使用消息6中获得的Client公钥对消息进行验证。
Client->Server ChangeCipherSpec
Client使用客户端随机数,服务器随机数以及premaster secret产生加密消息的对称密钥Master Secret。然后发送此消息告知Server后续消息将使用对称密钥加密
Client->Server Finished
Client向Server发送此消息通知对端协商成功,此消息使用协商的公钥密钥加密。
Server->Client ChangeCipherSpec
Server使用客户端随机数,服务器随机数以及premaster secret产生加密消息的对称密钥Master Secret。然后发送此消息告知Client后续消息将使用对称密钥加密.
Server->Client Finished
Server向Client发送此消息通知对端协商成功,此消息使用协商的公钥密钥加密。
 
三、SSL通信模式:
 
1.服务端:
 
SSL服务端需要通过SSL服务套接字来提供服务接口,而SSL服务套接字需要通过SSL上下文实例来创建。以下是对SSL服务端的启用过程的描述。
 
(1)通过指定协议(一般是TLS)获取SSL上下文(SSLContext)实例。
 
(2)通过指定算法(X.509相关)获取密钥管理器工厂(KeyManagerFactory)实例。
 
(3)通过指定类型和提供者获取密钥库(KeyStore)实例。
 
(4)密钥库实例使用约定的密码加载(Load)密钥库文件(.keystore)。
 
(5)密钥管理器工厂实例使用约定的密码和(4)中密钥库进行初始化(Initialize)。
 
(6)SSL上下文实例通过密钥管理器工厂实例提供的密钥管理器来初始化(Initialize)。
 
(7)当SSL上下文实力初始化成功后,就可以获取该上下文势力所关联的服务套接字工厂(ServerSocketFactory)实例
 
(8)服务套接字工厂实例依据指定的服务端口来创建(Create)服务套接字(ServerSocket)。
 
(9)当SSL服务套接字创建成功,就可以等待客户端的连接,与客户端进行通信。
 
(10)通信完毕可以关闭服务套接字。
 
2.客户端
 
(1)通过指定协议(一般是TLS)获取SSL上下文(SSLContext)实例。
 
(2)通过指定算法(X.509相关)获取密钥管理器工厂(KeyManagerFactory)实例。
 
(3)通过指定算法(X.509相关)获取信任管理器工厂(TrustManagerFactory)实例。
 
(4)通过指定类型和提供者获取密钥库(KeyStore)实例。
 
(5)通过指定类型和提供者获取信任密钥库(KeyStore)实例。
 
(6)(4)中密钥库实例使用约定的密码加载(Load)密钥库文件(.keystore)。
 
(7)(5)中信任密钥库实例使用约定的密码加载(Load)密钥库文件(.keystore)。
 
(8)密钥管理器工厂实例使用约定的密码和(4)中密钥库进行初始化(Initialize)。
 
(9)信任密钥管理器工厂实例使用约定的密码和(5)中密钥库进行初始化(Initialize)。
 
(10)当SSL上下文实力初始化成功后,就可以获取该上下文实例所关联的套接字工厂(SocketFactory)实例
 
(11)套接字工厂实例依据指定的主机和端口来创建(Create)客户端套接字(Socket)。
 
(12)当SSL服务套接字创建成功,就可以向服务端发送请求,与服务端进行通信。
 
(13)
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,