sunplusedu的个人空间 https://blog.eetop.cn/sunplusedu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

【凌阳教育学堂】Android开发实现SSL握

已有 944 次阅读| 2011-12-13 17:18 |个人分类:嵌入式培训

来源: 凌阳教育嵌入式培训
  凌阳教育是全国唯一“学员就业双100%品牌”,保证“学员100%就业”,保证“学员100%满意就业”。凌阳教育也是全国唯一“按班公布学员就业去向诚信机构”,每个班所有学员来自哪个学校就业后签约哪家企业都真实发布。截止2011年9月,凌阳教育学员已连续27期“双100%就业”。凌阳教育是全国唯一“原厂嵌入式培训机构”,以凌阳科技产业链企业的人才需求为契机,先后与2500多家企业建立学员就业合作关系。

  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 utput = 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()  .openRawResourc(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 { 
              ut = 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(); 
      } 
  }

  凌阳教育“学员就业双100%”的诚信获得了社会的广泛认可,2008年、2009年、2010年,凌阳教育连续三年荣膺新浪“中国十大品牌IT教育机构”、新浪“最具就业竞争力IT教育机构”、搜狐“中国十大品牌IT培训机构”、网易“中国十大IT教育品牌”荣誉称号。凌阳教育是嵌入式培训领域,唯一全部获得三大门户网站“十大IT品牌”表彰的机构。

嵌入式培训

凌阳教育嵌入式培训,值得信赖的嵌入式教育品牌!

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 1928

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-8 11:23 , Processed in 0.035770 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部