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.pswp.cn/news/387440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387440.shtml
英文地址,請注明出處:http://en.pswp.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;來…