android 实现SSL握手协商

Android的私钥和信任证书的格式必须是BKS格式的,通过配置本地JDK,让keytool可以生成BKS格式的私钥和信任证书,java本身没有BouncyCastle密库  ssl通道建立前必须进行协商(形成安全的通道--隧道技术)。

服务端:

View Code
 1 public class SSLServer {
 2 
 3     private static final int SERVER_PORT = 50030;
 4     private static final String SERVER_KEY_PASSWORD = "123456";
 5     private static final String SERVER_AGREEMENT = "TLS";//使用协议
 6     private static final String SERVER_KEY_MANAGER = "SunX509";//密钥管理器
 7     private static final String SERVER_KEY_KEYSTORE = "JKS";//密库,这里用的是Java自带密库
 8     private static final String SERVER_KEYSTORE_PATH = "src/data/kserver.keystore";//密库路径
 9     private SSLServerSocket serverSocket;
10 
11     public static void main(String[] args) {
12         SSLServer server = new SSLServer();
13         server.init();
14         server.start();
15     }
16 
17     //由于该程序不是演示Socket监听,所以简单采用单线程形式,并且仅仅接受客户端的消息,并且返回客户端指定消息
18     public void start() {
19         if (serverSocket == null) {
20             System.out.println("ERROR");
21             return;
22         }
23         while (true) {
24             try {
25                 System.out.println("Server Side......");
26                 Socket s = serverSocket.accept();
27                 InputStream input = s.getInputStream();
28                 OutputStream output = s.getOutputStream();
29 
30                 BufferedInputStream bis = new BufferedInputStream(input);
31                 BufferedOutputStream bos = new BufferedOutputStream(output);
32 
33                 byte[] buffer = new byte[20];
34                 bis.read(buffer);
35                 System.out.println(new String(buffer));
36 
37                 bos.write("This is Server".getBytes());
38                 bos.flush();
39 
40                 s.close();
41             } catch (Exception e) {
42                 System.out.println(e);
43             }
44         }
45     }
46     
47     public void init() {
48         try {
49             //取得SSLContext
50             SSLContext ctx = SSLContext.getInstance(SERVER_AGREEMENT);
51             //取得SunX509私钥管理器
52             KeyManagerFactory kmf = KeyManagerFactory.getInstance(SERVER_KEY_MANAGER);
53             //取得JKS密库实例
54             KeyStore ks = KeyStore.getInstance(SERVER_KEY_KEYSTORE);
55             //加载服务端私钥
56             ks.load(new FileInputStream(SERVER_KEYSTORE_PATH), SERVER_KEY_PASSWORD.toCharArray());
57             //初始化
58             kmf.init(ks, SERVER_KEY_PASSWORD.toCharArray());
59             //初始化SSLContext
60             ctx.init(kmf.getKeyManagers(),null, null);
61             //通过SSLContext取得ServerSocketFactory,创建ServerSocket
62             serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(SERVER_PORT);
63         } catch (Exception e) {
64             System.out.println(e);
65         }
66     }
67 }

客户端:

View Code
  1 public class MySSLSocket extends Activity {
  2     private static final int SERVER_PORT = 50030;//端口号
  3     private static final String SERVER_IP = "218.206.176.146";//连接IP
  4     private static final String CLIENT_KET_PASSWORD = "123456";//私钥密码
  5     private static final String CLIENT_TRUST_PASSWORD = "123456";//信任证书密码
  6     private static final String CLIENT_AGREEMENT = "TLS";//使用协议
  7     private static final String CLIENT_KEY_MANAGER = "X509";//密钥管理器
  8     private static final String CLIENT_TRUST_MANAGER = "X509";//
  9     private static final String CLIENT_KEY_KEYSTORE = "BKS";//密库,这里用的是BouncyCastle密库
 10     private static final String CLIENT_TRUST_KEYSTORE = "BKS";//
 11     private static final String ENCONDING = "utf-8";//字符集
 12     private SSLSocket Client_sslSocket;
 13     private Log tag;
 14     private TextView tv;
 15     private Button btn;
 16     private Button btn2;
 17     private Button btn3;
 18     private EditText et;
 19     
 20     /** Called when the activity is first created. */
 21     @Override
 22     public void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         setContentView(R.layout.main);
 25         tv = (TextView) findViewById(R.id.TextView01);
 26         et = (EditText) findViewById(R.id.EditText01);
 27         btn = (Button) findViewById(R.id.Button01);
 28         btn2 = (Button) findViewById(R.id.Button02);
 29         btn3 = (Button) findViewById(R.id.Button03);
 30         
 31         btn.setOnClickListener(new Button.OnClickListener(){
 32             @Override
 33             public void onClick(View arg0) {
 34                 if(null != Client_sslSocket){
 35                     getOut(Client_sslSocket, et.getText().toString());
 36                     getIn(Client_sslSocket);
 37                     et.setText("");
 38                 }
 39             }
 40         });
 41         btn2.setOnClickListener(new Button.OnClickListener(){
 42             @Override
 43             public void onClick(View arg0) {
 44                 try {
 45                     Client_sslSocket.close();
 46                     Client_sslSocket = null;
 47                 } catch (IOException e) {
 48                     e.printStackTrace();
 49                 }
 50             }
 51         });
 52         btn3.setOnClickListener(new View.OnClickListener(){
 53             @Override
 54             public void onClick(View arg0) {
 55                 init();
 56                 getIn(Client_sslSocket);
 57             }
 58         });
 59     }
 60     
 61     public void init() {
 62         try {
 63             //取得SSL的SSLContext实例
 64             SSLContext sslContext = SSLContext.getInstance(CLIENT_AGREEMENT);
 65             //取得KeyManagerFactory和TrustManagerFactory的X509密钥管理器实例
 66             KeyManagerFactory keyManager = KeyManagerFactory.getInstance(CLIENT_KEY_MANAGER);
 67             TrustManagerFactory trustManager = TrustManagerFactory.getInstance(CLIENT_TRUST_MANAGER);
 68             //取得BKS密库实例
 69             KeyStore kks= KeyStore.getInstance(CLIENT_KEY_KEYSTORE);
 70             KeyStore tks = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE);
 71             //加客户端载证书和私钥,通过读取资源文件的方式读取密钥和信任证书
 72             kks.load(getBaseContext()
 73                     .getResources()
 74                     .openRawResource(R.drawable.kclient),CLIENT_KET_PASSWORD.toCharArray());
 75             tks.load(getBaseContext()
 76                     .getResources()
 77                     .openRawResource(R.drawable.lt_client),CLIENT_TRUST_PASSWORD.toCharArray());
 78             //初始化密钥管理器
 79             keyManager.init(kks,CLIENT_KET_PASSWORD.toCharArray());
 80             trustManager.init(tks);
 81             //初始化SSLContext
 82             sslContext.init(keyManager.getKeyManagers(),trustManager.getTrustManagers(),null);
 83             //生成SSLSocket
 84             Client_sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket(SERVER_IP,SERVER_PORT);
 85         } catch (Exception e) {
 86             tag.e("MySSLSocket",e.getMessage());
 87         }
 88     }
 89         
 90     public void getOut(SSLSocket socket,String message){
 91         PrintWriter out;
 92         try {
 93             out = new PrintWriter(
 94                     new BufferedWriter(
 95                             new OutputStreamWriter(
 96                                     socket.getOutputStream()
 97                                     )
 98                             ),true);
 99             out.println(message);
100         } catch (IOException e) {
101             e.printStackTrace();
102         }
103     }
104     
105     public void getIn(SSLSocket socket){
106         BufferedReader in = null;
107         String str = null;
108         try {
109             in = new BufferedReader(
110                     new InputStreamReader(
111                             socket.getInputStream()));
112             str = new String(in.readLine().getBytes(),ENCONDING);
113         } catch (UnsupportedEncodingException e) {
114             e.printStackTrace();
115         } catch (IOException e) {
116             e.printStackTrace();
117         }
118         new AlertDialog
119         .Builder(MySSLSocket.this)
120         .setTitle("服务器消息")
121         .setNegativeButton("确定", null)
122         .setIcon(android.R.drawable.ic_menu_agenda)
123         .setMessage(str)
124         .show();
125     }
126 }

 

转载于:https://www.cnblogs.com/sunfb/archive/2013/02/27/2935525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信&#x…

1 概述

Unix C TCP/IP 三位一体 Linux天生是网络操作系统 程序员的学习:不断地敲代码,不断地看别人的代码。 Linux两大领域: (1)服务器 (2)嵌入式设备 www.netcraft.com 查看网站服务器系统 VMware快…

对我影响最大的三位老师

读书也读了那么多年了,遇见了许多的老师,他们教不同的科目,各司其职,兢兢业业的做着自己的本职工作。在我的学生时代印象最深的有三位老师。第一位是我的初中语文老师邹老师,他上课非常有趣,语文课&#xf…

Java Annotation认知(包括框架图、详细介绍、示例说明)

摘要 Java Annotation是JDK5.0引入的一种注释机制。 网上很多关于Java Annotation的文章,看得人眼花缭乱。Java Annotation本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。 我按照自己的思路,对Annotation进行了整理。理解…

matlab练习程序(RGB2HSL、HSL2RGB)

色相饱和度亮度和三原色的相互转换 function mainimgimread(lena_color.jpg);imgmat2gray(img); %任意区间映射到[0,1];[m n dim]size(img);imshow(img);%%图像的RGBRimg(:,:,1);Gimg(:,:,2);Bimg(:,:,3);%%图像RGB2HSLHzeros(m,n); %色相角Szeros(m,n); %饱和度Lzeros(m,…

2 文件处理、权限管理、搜索

文件处理命令: ls -a -l -d -h -i mkdir -p parents cd . .. /tmp/Japan pwd rmdir cp -r -p source destination 可改名recursive preserve mv source destination 剪切文件 改名 ctrl l 清屏 或者 clear命令 rm -r -f touch 新建文件 带空格需加…

第38节: Vue3 鼠标按钮修改器

在UniApp中使用Vue3框架时&#xff0c;你可以使用按键修饰符来更精确地处理键盘事件。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用.left、.right和.middle按键修饰符&#xff1a; <template> <view> <input keydown"handleKeyDown&…

Go语言学习之3 流程控制、函数

主要内容&#xff1a; 1. strings和strconv使用2. Go中的时间和日期类型3. 指针类型4. 流程控制5. 函数详解 1. strings和strconv使用 //strings 1. strings.HasPrefix(s string, prefix string) bool&#xff1a;判断字符串s是否以prefix开头 。 2. strings.HasSuffix(s strin…

RabbitMQ教程总结

【译】RabbitMQ教程一 主要通过Hello Word对RabbitMQ有初步认识 【译】RabbitMQ教程二 工作队列&#xff0c;即一个生产者对多个消费者循环分发、消息确认、消息持久、公平分发 【译】RabbitMQ教程三 如何同一个消息同时发给多个消费者开始引入RabbitMQ消息模型中的重要概念路由…

3 帮助命令、用户管理、压缩

帮助命令&#xff1a; man 命令或配置文件 获得帮助信息 /l 查看所有和l相关的行 q 退出 man passwd 1命令的帮助 5配置文件的帮助 man 1 passwd man 5 passwd 默认查看命令的帮助 man 5 passwd 查看配置文件的帮助 whatis 命令 查看命令的功能性描述 whatis ls ap…

[bzoj1039] [ZJOI2008]无序运动Movement

Description D博士对物理有着深入的研究&#xff0c;经典物理、天体物理、量子物理都有着以他的名字命名的定理。最近D博士着迷于研究粒子运动的无规则性。对圣经深信不疑的他相信&#xff0c;上帝创造的任何事物必然是有序的、有理可循的&#xff0c;而不是无规则的、混沌的。…

关于shiro session失效报错问题

最近做了一个项目&#xff0c;要用到shiro&#xff0c;做完之后发现有个异常经常发生org.apache.shiro.session.UnknownSessionException: There is no session with id &#xff0c;经过多天的研究&#xff0c;终于得以解决 登录的时候异常信息&#xff1a; [java] view plain…

4 网络、挂载、关机

网络命令: 给在线用户发信 write 用户名 编辑时&#xff0c;Ctrl退格键删除错误输入 CtrlD 保存输入信息 wall 给所有在线用户发信 ping命令 -c指定发送次数 ping -c 3 192.168.231.1 ifconfig 查看网卡信息 ifconfig eth1 192.168.231.100 临时设置IP地址 mail 用户名 …

#191 sea(动态规划)

假设已经求出了i个点j个桥的连通图数量f[i][j]&#xff0c;容易由此推出最终答案&#xff0c;套路地枚举1号点所在连通块大小即可。 假设已经求出了i个点的边双连通图数量h[i]&#xff0c;考虑由此推出f[i][j]。可以枚举其中一座桥将图划分成两个部分&#xff0c;固定1号点在其…

linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下

linux下获取占用CPU资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a; ps aux|head -1;ps aux|grep -v PID|sort -rn -k 3|head linux下获取占用内存资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a; ps aux|head -1;ps aux|grep -v PID|s…

自定义注解与validation结合使用案例

案例1&#xff1a; [java] view plaincopy import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import…

5 Vim编辑器的使用

vi filename 命令模式 a i o 插入模式 后前 行 Esc键 回到命令模式 Shift&#xff1a; 编辑模式 set nu加行号 执行完命令后直接回到命令模式 :set nu 设置行号 :set nonu 取消行号 移动命令&#xff1a; gg 到第一行 G 到最后一行 nG 到第n行 :n到第n行 $ 移至行…

机器学习实战(笔记)------------KNN算法

1.KNN算法 KNN算法即K-临近算法&#xff0c;采用测量不同特征值之间的距离的方法进行分类。 以二维情况举例&#xff1a; 假设一条样本含有两个特征。将这两种特征进行数值化&#xff0c;我们就可以假设这两种特种分别为二维坐标系中的横轴和纵轴&#xff0c;将一个样本以点的形…

hive的安装配置

hive只需安装在一个节点上。 1、将安装包解压&#xff0c;cd入conf文件夹下&#xff0c;执行命令cp hive-default.xml hive-site.xml 2、更改hive-site.xml的配置项 </property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql:/…

Java注解Annotation 完成验证

Java注解Annotation用起来很方便&#xff0c;也越来越流行&#xff0c;由于其简单、简练且易于使用等特点&#xff0c;很多开发工具都提供了注解功能&#xff0c;不好的地方就是代码入侵比较严重&#xff0c;所以使用的时候要有一定的选择性。 这篇文章将利用注解&#xff0c;来…