Android 使用HttpClient通信,发送SSL证书认证

  private static final String SERVER_IP = "10.0.2.2 "; //本地IP
    private static final int SERVER_PORT = 443 ; //端口号  
    private static final String CLIENT_KET_PASSWORD = "*** "; //私钥密码 private static final String CLIENT_TRUST_PASSWORD = "*** ";//信任证书密码 private static final String CLIENT_AGREEMENT = "TLS"; //使用协议 private static final String CLIENT_KEY_MANAGER = "X509"; //密钥管理器 private static final String CLIENT_TRUST_MANAGER = "X509"; //信任证书管理器 private static final String CLIENT_KEY_KEYSTORE = "BKS"; //"JKS";//密库,这里用的是BouncyCastle密库 private static final String CLIENT_TRUST_KEYSTORE = "BKS"; //"JKS";// private static final String URL = "https://10.0.2.2 :443/payment";
 
/*
//取得SSL的SSLContext实例
SSLContext sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);
 
//取得keyManageFactory和TrustManagerFactory的x509密钥管理实例
KeyManagerFactory keyManager = KeyManagerFactory.getInstance(CLIENT_KEY_MANAGER);
TrustManagerFactory trustManager = TrustManagerFactory.getInstance(CLIENT_TRUST_MANAGER);
 
//取得BKS密库实例
KeyStore kks = KeyStore.getInstance(CLIENT_KEY_KEYSTORE);
KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);
 
//加载客户端证书和私钥,通过读取资源文件的方式读取密钥和信任证书
kks.load(context.getAssets().open("cacerts.bks"), CLIENT_KET_PASSWORD.toCharArray());
tks.load(context.getAssets().open(""), CLIENT_TRUST_PASSWORD.toCharArray());
 
 
//初始化密钥管理器
keyManager.init(kks, CLIENT_KET_PASSWORD.toCharArray());
 
//初始化SSLContext
sslContext.init(keyManager.getKeyManagers(), null, null);
 
//生成SSLSocket
//SSLSocket Client_sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(SERVER_IP, SERVER_PORT);
*/
 
private String httpPost(String xmlStr) throws CommException {
try {
 
KeyStore kks = KeyStore.getInstance(KeyStore.getDefaultType());
kks.load(context.getAssets().open("cacerts.bks"), CLIENT_KET_PASSWORD.toCharArray());
 
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(kks);
sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
 
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
 
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", sslSocketFactory, SERVER_PORT));
ThreadSafeClientConnManager conMgr = new ThreadSafeClientConnManager(params, schReg);
 
HttpClient httpClient = new DefaultHttpClient(conMgr, params);
 
HttpPost httpRequest = new HttpPost(URL);
StringEntity reqEntity = new StringEntity(xmlStr, HTTP.UTF_8);
reqEntity.setContentType("text/xml;charset=UTF-8");
reqEntity.setChunked(true);
httpRequest.setEntity(reqEntity);
 
httpRequest.getRequestLine().toString();
 
 
HttpResponse httpResponse = httpClient.execute(httpRequest);
if( httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK ){
Log.v(CLASSTAG, "----------ok");
}else{
Log.v(CLASSTAG, "----------no ok");
}
 
} catch (Exception e) {
Log.e(CLASSTAG, e.toString());
}
return xmlStr;
 
}
 
----------------------------------------------------------------------------------------------------------------

    1. SSL高于TCP/IP但低于HTTP,LDAP,IMAP等网络协议;

2.       服务器认证:客户端程序通过信任列表(CA list)验证服务器证书(Server certificate);

3.       客户端认证:服务器端程序通过信任列表验证客户端证书;

4.       这两个信任列表是不同的,服务器端的信任列表存放的是可信的客户端列表,而客户端信任列表里面存放的是可信的服务器列表。

5.       the SSL record protocol defines the format used to transmit data.

6.       the SSL handshake protocol using the SSL record protocol to exchange a series of messages between client and server when they first establish an SSL connection.

7.       握手过程中双方会选择一种共有的最强的cipher suites来作为后期SSL连接使用的算法;(如果库里RSA不是最强的怎么办?)

8.       握手过程:

a)         过程概述:用公钥和证书来实现客户端对服务器的验证;合作生成一个对称加密算法的密码;可选的,也可以实现服务器对客户端的验证;

b)        客户端发送客户端使用的SSL版本,加密设置,随机数……;

c)        服务器发送服务器使用的SSL版本,加密设置,随机数……,服务器还会发送自己的证书给客户端进行验证,如果需要客户端认证,那么还会发送客户端认证请求;

d)        客户端通过发送过来的证书来验证服务器,如果没有验证通过,应警告无法通过验证,如果通过验证,继续下面的步骤;通过握手过程中的数据,生成预主密钥,并用服务器端的公钥加密(该公钥从服务器证书中可以得到),然后将加密结果发送给服务器端(如果服务器要求客户端验证,那么还要将客户端证书一并发送)。发送后用预主密钥生成主密钥(Master key);

e)         (如果服务器要求客户端认证,此时先要验证客户端证书,如果通过才可以继续下面步骤)服务器用自己的私钥解密客户端发过来的加密预主密钥,用预主密钥生成主密钥(Master key);

f)         服务器和客户端分别由主密钥生成密钥(session key);

g)        握手结束互相通知以后所有信息会使用密钥(session key)来加密传输;

h)        开始SSL session。

9.       服务器端认证

a)         是否当前还在有效期内;

b)        证书是否在信任列表内;

c)        客户端使用信任列表里的公钥验证服务器证书里的数字签名;

d)        对比服务器域名和证书里的域名;

10.       客户端认证

a)         如果服务器要求客户端认证,客户端不光要将自己的证书发送过去,还要在证书末尾加一段数字签名;

b)        服务器用证书中的公钥检查客户端发过来的数字签名

c)        是否当前还在有效期内;

d)        证书是否在信任列表内;

e)         服务器使用信任列表里的公钥验证证书(该证书没有说明是哪个证书)里的数字签名;

 

转载自:http://lanyu-qd.blog.163.com/blog/static/35725662201161434415502/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值