`
vnplalvyulin
  • 浏览: 13039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互

阅读更多
Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库

服务端:
Java代码

public class SSLServer {  
  
    private static final int SERVER_PORT = 50030;  
    private static final String SERVER_KEY_PASSWORD = "123456";  
    private static final String SERVER_AGREEMENT = "TLS";//使用协议  
    private static final String SERVER_KEY_MANAGER = "SunX509";//密钥管理器  
    private static final String SERVER_KEY_KEYSTORE = "JKS";//密库,这里用的是Java自带密库  
    private static final String SERVER_KEYSTORE_PATH = "src/data/kserver.keystore";//密库路径  
    private SSLServerSocket serverSocket;  
  
    public static void main(String[] args) {  
        SSLServer server = new SSLServer();  
        server.init();  
        server.start();  
    }  
  
    //由于该程序不是演示Socket监听,所以简单采用单线程形式,并且仅仅接受客户端的消息,并且返回客户端指定消息  
    public void start() {  
        if (serverSocket == null) {  
            System.out.println("ERROR");  
            return;  
        }  
        while (true) {  
            try {  
                System.out.println("Server Side......");  
                Socket s = serverSocket.accept();  
                InputStream input = s.getInputStream();  
                OutputStream output = s.getOutputStream();  
  
                BufferedInputStream bis = new BufferedInputStream(input);  
                BufferedOutputStream bos = new BufferedOutputStream(output);  
  
                byte[] buffer = new byte[20];  
                bis.read(buffer);  
                System.out.println(new String(buffer));  
  
                bos.write("This is Server".getBytes());  
                bos.flush();  
  
                s.close();  
            } catch (Exception e) {  
                System.out.println(e);  
            }  
        }  
    }  
      
    public void init() {  
        try {  
            //取得SSLContext  
            SSLContext ctx = SSLContext.getInstance(SERVER_AGREEMENT);  
            //取得SunX509私钥管理器  
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(SERVER_KEY_MANAGER);  
            //取得JKS密库实例  
            KeyStore ks = KeyStore.getInstance(SERVER_KEY_KEYSTORE);  
            //加载服务端私钥  
            ks.load(new FileInputStream(SERVER_KEYSTORE_PATH), SERVER_KEY_PASSWORD.toCharArray());  
            //初始化  
            kmf.init(ks, SERVER_KEY_PASSWORD.toCharArray());  
            //初始化SSLContext  
            ctx.init(kmf.getKeyManagers(),null, null);  
            //通过SSLContext取得ServerSocketFactory,创建ServerSocket  
            serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(SERVER_PORT);  
        } catch (Exception e) {  
            System.out.println(e);  
        }  
    }  
}  

客户端:
Java代码

public class MySSLSocket extends Activity {  
    private static final int SERVER_PORT = 50030;//端口号  
    private static final String SERVER_IP = "218.206.176.146";//连接IP  
    private static final String CLIENT_KET_PASSWORD = "123456";//私钥密码  
    private static final String CLIENT_TRUST_PASSWORD = "123456";//信任证书密码  
    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";//密库,这里用的是BouncyCastle密库  
    private static final String CLIENT_TRUST_KEYSTORE = "BKS";//  
    private static final String ENCONDING = "utf-8";//字符集  
    private SSLSocket Client_sslSocket;  
    private Log tag;  
    private TextView tv;  
    private Button btn;  
    private Button btn2;  
    private Button btn3;  
    private EditText et;  
      
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        tv = (TextView) findViewById(R.id.TextView01);  
        et = (EditText) findViewById(R.id.EditText01);  
        btn = (Button) findViewById(R.id.Button01);  
        btn2 = (Button) findViewById(R.id.Button02);  
        btn3 = (Button) findViewById(R.id.Button03);  
          
        btn.setOnClickListener(new Button.OnClickListener(){  
            @Override  
            public void onClick(View arg0) {  
                if(null != Client_sslSocket){  
                    getOut(Client_sslSocket, et.getText().toString());  
                    getIn(Client_sslSocket);  
                    et.setText("");  
                }  
            }  
        });  
        btn2.setOnClickListener(new Button.OnClickListener(){  
            @Override  
            public void onClick(View arg0) {  
                try {  
                    Client_sslSocket.close();  
                    Client_sslSocket = null;  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        });  
        btn3.setOnClickListener(new View.OnClickListener(){  
            @Override  
            public void onClick(View arg0) {  
                init();  
                getIn(Client_sslSocket);  
            }  
        });  
    }  
      
    public void init() {  
        try {  
            //取得SSL的SSLContext实例  
            SSLContext sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);  
            //取得KeyManagerFactory和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(getBaseContext()  
                    .getResources()  
                    .openRawResource(R.drawable.kclient),CLIENT_KET_PASSWORD.toCharArray());  
            tks.load(getBaseContext()  
                    .getResources()  
                    .openRawResource(R.drawable.lt_client),CLIENT_TRUST_PASSWORD.toCharArray());  
            //初始化密钥管理器  
            keyManager.init(kks,CLIENT_KET_PASSWORD.toCharArray());  
            trustManager.init(tks);  
            //初始化SSLContext  
            sslContext.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),null);  
            //生成SSLSocket  
            Client_sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(SERVER_IP,SERVER_PORT);  
        } catch (Exception e) {  
            tag.e("MySSLSocket",e.getMessage());  
        }  
    }  
          
    public void getOut(SSLSocket socket,String message){  
        PrintWriter out;  
        try {  
            out = new PrintWriter(  
                    new BufferedWriter(  
                            new OutputStreamWriter(  
                                    socket.getOutputStream()  
                                    )  
                            ),true);  
            out.println(message);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
      
    public void getIn(SSLSocket socket){  
        BufferedReader in = null;  
        String str = null;  
        try {  
            in = new BufferedReader(  
                    new InputStreamReader(  
                            socket.getInputStream()));  
            str = new String(in.readLine().getBytes(),ENCONDING);  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        new AlertDialog  
        .Builder(MySSLSocket.this)  
        .setTitle("服务器消息")  
        .setNegativeButton("确定", null)  
        .setIcon(android.R.drawable.ic_menu_agenda)  
        .setMessage(str)  
        .show();  
    }  
}  

                                                         
分享到:
评论

相关推荐

    Java ssl socket 双向认证

    3. **信任库**:服务器需要一个包含所有可能客户端证书的可信证书库,客户端则需要一个包含服务器证书的可信证书库。 4. **SSLContext**:这是Java中配置SSL设置的核心对象,可以用来创建SSLSocketFactory和...

    openssl实现服务器和客户端

    SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议是互联网上广泛使用的安全通信协议,它们为客户端和服务器之间提供了端到端的数据加密,确保了数据在传输过程中的私密性和完整性。当一个客户端...

    Android SSL证书验证原理

    在Android平台上实现安全的数据传输通常依赖于SSL(Secure Sockets Layer)或其后续版本TLS(Transport Layer Security),它们为客户端和服务端之间的通信提供加密保护。本篇文章将深入探讨Android平台上的SSL证书...

    TLS/SSL Socket 实现

    在Python中,可以使用`ssl.create_default_context()`来创建上下文,并通过`load_cert_chain()`加载服务器证书。 4. **包装Socket**:使用创建的SSL上下文将普通Socket包装成SSL Socket,如Python的`ssl.wrap_...

    httpclient访问需要客户端认证数字证书的https接口的处理方法

    在这个自定义实现中,你需要加载之前安装的客户端证书和私钥,然后将它们添加到SSLContext中。SSLContext是SSL/TLS协议的核心,负责管理密钥、证书以及握手过程。 以下是一个简单的步骤概述: 1. 使用`InstallCert...

    ssl 详解过程交互

    SSL(Secure Socket Layer)安全套接层协议是一种用于在客户端和服务器之间建立安全通信通道的协议,它由Netscape Communications公司于1995年首次提出。SSL协议利用公开密钥体制和X.509数字证书技术,确保信息传输...

    基于ssl的Java的socket网络通信

    在IT行业中,网络通信是应用程序之间交互的基础,而Java作为一种广泛应用的编程语言,提供了丰富的库和API来实现网络通信。本篇文章将详细讲解基于SSL(Secure Socket Layer)的Java Socket网络通信,帮助开发者理解...

    SSL及HTTPS协议_world_java_https客户端_ssl_distancemiy_

    SSL是一种用于网络通信的安全协议,它通过在客户端和服务器之间建立加密通道来保护数据的传输。SSL协议主要包括握手协议、记录协议、密钥交换协议和证书协议等组件。在握手过程中,客户端和服务器会协商加密算法、...

    SSL证书在线生成系统源码

    当浏览器与服务器之间建立HTTPS连接时,会进行SSL握手,交换证书,验证服务器身份,并协商加密算法,确保通信的安全。 二、PKI原理 公钥基础设施(Public Key Infrastructure, PKI)是SSL证书的核心组成部分,包括...

    OpenSSL加密通信文档.7z

    5. **SSL握手**:在连接建立后,执行SSL握手,这是客户端和服务器之间的交互,以确认彼此的身份并交换加密密钥。 6. **安全通信**:握手成功后,你就可以通过`SSLSocket`安全地发送和接收数据了。所有数据都会自动...

    打开socket 下载https文件

    这个过程包括客户端发送Hello消息,服务器回应,交换加密算法,验证服务器证书,协商会话密钥等步骤。一旦握手成功,就可以通过SSL Socket安全地发送HTTP请求了。 对于文件下载,我们需要构造一个HTTP GET请求,...

    com.sun.net.ssl.jar

    《深入理解Java SSL机制:以`com.sun.net.ssl.jar`为入口》 在Java平台中,安全套接层(SSL,Secure Sockets Layer)...在实际开发中,我们需要根据具体需求,选择合适的SSL/TLS配置,以达到最佳的安全性和性能平衡。

    TLS加密Java实现

    密钥库用于存放服务器的私钥和证书,而信任库则包含客户端信任的服务器证书。可以使用`keytool`命令行工具创建和管理这些库。 5. **SSL/TLS握手过程**:在建立加密连接时,客户端和服务器会进行一系列的交互,即TLS...

    客户端与服务端通信

    当用户登录时,浏览器与服务器之间会进行SSL/TLS握手,协商加密算法,并生成一个会话密钥,用于加密后续的数据传输。这样,即使数据在网络中被截获,由于加密,攻击者也无法解读其内容。 标签中的“Socket”是网络...

    ssl-socket 客户Duan模块v1.3-易语言

    3. **握手过程**:SSL连接建立前,客户端和服务器需要进行SSL握手,包括证书交换、密钥协商、协议版本确认等步骤。 4. **错误处理**:在处理SSL连接时,可能出现各种错误,如证书无效、网络中断等,开发者需要编写...

    Android Https通信

    在Android开发中,HTTPS通信是应用与服务器之间安全交互的重要环节。HTTPS,即HTTP over SSL/TLS,是一种基于HTTP协议的、使用SSL/TLS协议加密的网络通信方式,旨在保护数据传输过程中的安全性,防止数据被窃取或...

    Wininet SSL 实现http 数据上传

    4. **SSL握手**: 当请求对象被创建后,Wininet会自动进行SSL握手,这个过程包括证书交换、密钥协商等步骤,确保连接的安全性。 5. **发送数据**: 使用`HttpSendRequest()`函数将数据发送到服务器。在发送前,可能...

    用OpenSSL编写SSL,TLS程序

    OpenSSL作为强大的加密库和命令行工具,在实现SSL/TLS协议方面提供了非常全面的支持。通过对SSL/TLS的基本概念理解以及具体的编程实践,可以有效地开发出安全的网络应用程序。然而需要注意的是,由于OpenSSL的文档...

    https知识经验总结-性能测试

    录制SSL脚本时,LoadRunner提供了相应的配置选项,对于单向SSL,通常只需导入服务器证书;而对于双向SSL,还需要设置客户端证书和私钥。 在Java编程中,可以使用JSSE(Java Secure Socket Extension)库来编写HTTPS...

    linux、webservice、ssl、socket、搜索引擎nutch.rar

    Linux是世界上最流行的开源操作系统之一,它是基于Unix设计的,提供了强大...而Socket编程则在实现Web服务器、搜索引擎与客户端之间的通信中起到关键作用。因此,全面掌握这些知识点,能让你在IT领域具备更全面的能力。

Global site tag (gtag.js) - Google Analytics