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/