Think_mo

导航

 

本博文结合网络文章,主要供自己复习,如有引用他人文章,会加上链接

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协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
 
二、SSL协议的工作流程:
服务器认证阶段:
1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;
2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;
3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;
4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。 
用户认证阶段:
在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

三、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();
    }





}

 

posted on 2012-12-27 19:14  Think_mo  阅读(1771)  评论(0)    收藏  举报