本博文结合网络文章,主要供自己复习,如有引用他人文章,会加上链接
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(); }}
联系客服