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快…

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

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

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

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

RabbitMQ教程总结

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

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

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

Java注解Annotation 完成验证

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

隐藏马尔科夫模型HMM

概率图模型 HMM 先从一个具体的例子入手,看看我们要解决的实际问题.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consider two friends, Alice and Bob, who live far apart from each other and who talk together daily over the telephone about what …

阿里云天池 金融风控训练营Task1 广东工业站

Task1 赛题理解 一、学习知识点概要 本次学习先是介绍了赛题的背景和概况,题目以金融风控中的个人信贷为背景,给所给的47列特征中,根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过贷款。随后介绍了比赛中的评…

如何将.crt的ssl证书文件转换成.pem格式

如何将.crt的ssl证书文件转换成.pem格式摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装了php的linux操作系统执行下面的openssl命令即可:openssl x509 -in www.xx.com.crt -out www.xx.com.pem转载于:https://…

SpringMVC学习记录--Validator验证分析

一.基于Validator接口的验证. 首先创建User实例,并加入几个属性 ?12345678910111213141516171819202122232425262728293031323334<code class"hljs cs">public class User {private String username;private String password;private String nickname;public …

C# 获取句柄程序

这个小程序需要用到系统API&#xff0c;也就是需要用到user32中的三个函数。 第一个&#xff1a;WindowFromPoint 返回一个窗口句柄 第二个&#xff1a;GetWindowText 获取窗口标题 第三个&#xff1a;GetClassName 获取类名 当然&#xff0c;最重要的一点就是要引用命名空间…

centos7安装oracle12c 一

本文 基本参考了下面这篇文章http://blog.csdn.net/gq5251/article/details/42004035 和http://www.linuxidc.com/Linux/2017-08/146528.htm 但是改正了一些错误操作系统:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)几点要注…

阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容&#xff0c;学习链接为&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 一、学习知识点概要 本次主要通过阿里云天池的赛题【Python入门系…

JMETER从JSON响应中提取数据

如果你在这里&#xff0c;可能是因为你需要使用JMeter从Json响应中提取变量。 好消息&#xff01;您正在掌握掌握JMeter Json Extractor的权威指南。作为Rest API测试指南的补充&#xff0c;您将学习掌握Json Path Expressions 所需的一切。 我们走吧&#xff01;并且不要惊慌&…

centos7安装oracle12c 二

环境&#xff1a;CentOS7VMware12&#xff0c;分配资源&#xff1a;CPU&#xff1a;2颗&#xff0c;内存&#xff1a;4GB&#xff0c;硬盘空间&#xff1a;30GB Oracle 12C企业版64位 下载地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/down…

阿里云天池 Python训练营Task5:Python训练营测试 学习笔记

一、学习知识点概要 本次是Python训练营的测试&#xff0c;在45分钟内完成25题&#xff0c;满分100分及格80分。题目主要考察Task1到Task3里面的Python基础知识。在我随到的25道题里&#xff0c;知识点有&#xff1a; 变量&#xff08;包括数据类型和容器类型&#xff09;运算…

centos7安装oracle12c 三

场景描述&#xff1a;我在自己电脑的虚拟机上linux环境下安装oracle11g数据库。 Linux版本为&#xff1a;CentOS release 6.8 (Final)&#xff0c;Oracle版本为&#xff1a;linux.x64_11gR2 问题描述&#xff1a;在oracle安装到Prerequisite Checks这一步的时候&#xff0c;出现…

《属性数据分析引论》 部分课后习题R语言实践(第三章、第四章)

目录 前言 第三章 广义线性模型 习题3.18 a小题 b小题 c小题 d小题 习题3.19 a小题 b小题 c小题 第四章 Logistic回归 习题4.1 a小题 b小题 c小题 d小题 e小题 习题4.2 a小题 b小题 c小题 d小题 小结 前言 习题选自高等教育出版社译制&#xff0c;Alan A…

Linux下SVN搭建

在Linux系统中搭建svn服务所需要用到的软件叫做subversion&#xff0c;可以通过yum来进行安装&#xff0c;如图 安装好软件后第一件事就是创建一个仓库目录 [rootserver1 ~]# mkdir /svn 使用svn自带命令建立仓库 [rootserver1 ~]# svnadmin create /svn 进入该仓库&#xff0c…