打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【Android_网络编程 HTTPS与SSL通信

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

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();    }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java网络编程-用SSL构建安全的Socket - moonsee - JavaEye技...
对等计算实践: P2P 遇上 SSL
ActiveMQ SSL应用之四 编写Java Demo类使用SSL连接ActiveMQ
在mina中实现TSL/SSL双向认证连接(1)
JWT token心得与使用实例
Java SSL生成客户端和服务端crt文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服