本博文结合网络文章,主要供自己复习,如有引用他人文章,会加上链接
http://www.cnblogs.com/jason-jiang/archive/2008/06/02/1212118.html
还有《Android平台开发之旅》_王永松编著
一、HTTPS背景知识:
HTTPS可以视为HTTP的安全版本(Secure),其安全基础基于SSL协议(Secure Socket Layer,安全套接字层)。HTTPS在HTTP的基础上添加了一个加密和身份验证。其默认端口是443.对于一些对数据安全要求比较高的网络应用,比如网络支付,网上银行,都是采用HTTPS通信机制,其规范:RFC2818
HTTPS URL连接的方式访问HTTPS服务器与HTTP URL访问HTTP服务器的方式基本相同。用到的类:HttpsURLConnection
http://www.cnblogs.com/888h/archive/2010/10/29/1864131.html
一、SSL协议提供的服务主要有:
三、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)通信完毕可以关闭服务套接字。
这里贴一下SSL服务端线程和SSL客户端线程的代码,仅供参考:
public class ServerSocketThread extends Thread{
public static final String EXTRAS_KEY = "status";
public static final int SERVER_PORT = 10086;
private static final String PASSWORD = "master2010";
//SSL服务套接字
private SSLServerSocket mServSocket = null;
private boolean mIsRunning = false;
public ServerSocketThread(String ksPath){
try{
//初始化SSL服务
initSSLServer(ksPath);
}catch(Exception e){
e.printStackTrace();
}
}
//输出状态
private void sendStatus(String status){
System.out.println(status);
}
public void setIsRunning(boolean isRunning){
this.mIsRunning = isRunning;
}
public void run(){
while(mIsRunning){
//启动服务等待客户端连接
try{
//等待客户端的连接
SSLSocket clientSocket = (SSLSocket)mServSocket.accept();
sendStatus("Accept client"+
clientSocket.getInetAddress().getHostAddress()+":"+
clientSocket.getPort()+"");
//回复客户端
replyClient(clientSocket);
//关闭与客户端的连接
clientSocket.close();
}catch(IOException e ){
e.printStackTrace();
}
}
}
//回复给客户端
private void replyClient(SSLSocket clientSocket)throws IOException{
//获取与客户端的输入输出流
InputStream is = clientSocket.getInputStream();
OutputStream os = clientSocket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
if((line=br.readLine())!=null){
sendStatus("Got messge"+line+"");
}
PrintWriter pr = new PrintWriter(os);
String reply = "Talking over bye!";
pr.println(reply);
pr.flush();
sendStatus("Reply:"+reply+"");
//
pr.close();
br.close();
//
os.close();
is.close();
}
private void initSSLServer(String ksPath) throws NoSuchAlgorithmException,
KeyStoreException,
CertificateException,
UnrecoverableKeyException,
KeyManagementException{
try{
//取得TLS协议的上下文
SSLContext ctx = SSLContext.getInstance("TLS");
//取得SunX509私钥管理器工厂
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
//取得JKS密库实例
KeyStore ks = KeyStore.getInstance("JKS","SUN");
//加载服务端私钥
ks.load(new FileInputStream(ksPath),PASSWORD.toCharArray());
//初始化
kmf.init(ks,PASSWORD.toCharArray());
//初始化SSLContext
ctx.init(kmf.getKeyManagers(),null,null);
//通过SSLContex取得ServerSocketFactory,创建ServerSocket
mServSocket = (SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(SERVER_PORT);
sendStatus("Server starting @ port+"+SERVER_PORT+"...");
}catch(Exception e ){
e.printStackTrace();
}
}
}
public class ClientSocketThread extends Thread{
//通信配置
public static final String EXTRAS_KEY = "status";
public static final String SERVER_HOST = "127.0.0.1";
public static final int SERVER_PORT = 10086;
//
private static final String PASSWORD = "master2010";
private Context mContext = null;
private Handler mHandler = null;
//客户单套接字
private SSLSocket mClintSocket = null;
public ClientSocketThread(Context context,Handler handler){
mContext = context;
mHandler = handler;
try{
//初始化SSL客户端
initSSLClient();
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
if(this.mClintSocket!=null){
try{
//向服务端发送请求
requestServer();
}catch(IOException e){
e.printStackTrace();
}
}
super.run();
}
private void initSSLClient( ) throws NoSuchAlgorithmException,
KeyStoreException,
CertificateException,
UnrecoverableKeyException,
KeyManagementException{
try{
//取得TLS协议的上下文
SSLContext ctx = SSLContext.getInstance("TLS");
//取得X509标准的密钥管理器工厂实例
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
//取得X509标准的信任管理器工厂
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
//生成BC提供的BKS类型的密钥库
KeyStore kks = KeyStore.getInstance("BKS","BC");
//生成BC提供的BKS类型的信任密钥库
KeyStore tks = KeyStore.getInstance("BKS","BC");
//通过原文件资源载入密钥库的文件
kks.load(mContext.getResources().openRawResource(R.raw.foolstudio),PASSWORD.toCharArray());
tks.load(mContext.getResources().openRawResource(R.raw.foolstudio),PASSWORD.toCharArray());
//初始化密钥管理工厂实例
kmf.init(kks,PASSWORD.toCharArray());
tmf.init(tks);
//初始化SSLContext
ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null);
//通过SSLContex取得客户端SSL套接字
mClientSocket = (SSLSocket)ctx.getSocketFactory().createSocket(SERVER_HOST,SERVER_PORT);
//通过主线程消息队列处理器发送状态
sendStatus("Connet to "+SERVER_HOST+":"+SERVER_PORT+"...");
}catch(Exception e ){
e.printStackTrace();
}
}
//通过主线程消息队列处理器发送状态
private void sendStatus(String status){
Bundle bundle = new Bundle();
bundle.putString(EXTRAS_KEY,status);
Message msg = new Message();
msg.setData(bundle);
mHandler.sendMessage(msg);
}
//向服务端发送请求
private void requestServer()throws IOException{
//获取输出流(用于发送请求)
InputStream is = clientSocket.getInputStream();
OutputStream os = clientSocket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
if((line=br.readLine())!=null){
sendStatus("Got messge"+line+"");
}
PrintWriter pr = new PrintWriter(os);
String reply = "Talking over bye!";
pr.println(reply);
pr.flush();
sendStatus("Reply:"+reply+"");
//
pr.close();
br.close();
//
os.close();
is.close();
}
}
浙公网安备 33010602011771号