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

服务端:

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

客户端:

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

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

  1. Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码

    功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...

  2. 加密、签名和SSL握手机制细节

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 背景知识 对称加密     :加密解密使用同一密钥,加解密速度快.随 ...

  3. JavaFX打包到Android上

    让JavaFX执行到移动平台一直是社区努力完毕的事.  当然,眼下已经能够让JavaFX执行到Android和IOS平台了,以下我们来看看怎样打包自己的JavaFX项目到Android平台.  首先下 ...

  4. curl+个人证书(又叫客户端证书)访问https站点

    摘自http://blog.csdn.net/chary8088/article/details/22990741 curl+个人证书(又叫客户端证书)访问https站点 目前,大公司的OA管理系统( ...

  5. node.js中通过dgram数据报模块创建UDP服务器和客户端

    node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...

  6. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  7. SSL 握手过程

    SSL协议的握手过程 SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术.SSL 的握手协议非常有效的让客户和服务器 ...

  8. SSL握手过程

    原文地址: http://my.oschina.net/u/1188877/blog/164982 一.SSL握手有三个目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致:2. 它们需要确 ...

  9. SSL握手流程

    一.SSL是什么? 安全套接字(SSL)协议是Web浏览器和Web服务器之间安全交换信息的协议. SSL介于应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层 ...

随机推荐

  1. Hibernate 关系映射方式(1)

    来源:本文转载自:http://blog.csdn.net/huangaigang6688/article/details/7761310 Hibernate映射解析——七种映射关系 首先我们了解一个 ...

  2. servlet容器开发要点

    v1 是一个http服务器. v2 是一个servlet容器, 可以提供servlet的服务.   =>  动态load servlet字节码,并运行它( 按生命周期). servlet容器它来 ...

  3. Windsock套接字I/O模型学习 --- 第二章

    1. select模型 select模型主要借助于apiselect来实现,所以先介绍一下select函数 int select( int nfds, // 忽略,仅是为了与 Berkeley 套接字 ...

  4. springmvc+mybatis下载项目自带模板

    1.首先如果要获取javaweb项目中的文件在哪,用到的代码:request.getSession().getServletContext().getRealPath("/WEB-INF/d ...

  5. zzuli 1919 数列划分

    题面: Description 晴天想把一个包含n个整数的序列a分成连续的若干段,且和最大的一段的值最小,但他有强迫症,分的段数不能超过m段,然后他就不会分了...他想问你这个分出来的和最大的一段的和 ...

  6. asm: Writing Inline Assembly

    A usual IA includes these parts: asm [volatile] ( AssemblerTemplate : OutputOperands [ : InputOperan ...

  7. struts2+ajax实现异步验证

    由于老师布置作业的需要,在添加管理员的时候,要实现验证添加的管理员的用户名是否在数据库中已经存在,然后再客户端给用户一个提示.我首先想到的就是利用ajax实现异步验证技术,由于利用的ssh框架,所以在 ...

  8. JAVA动态代理详解

    1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程 ...

  9. ViewHolder最简洁的写法

    通用viewHolder工具类: public class ViewHolder { // I added a generic return type to reduce the casting no ...

  10. STL笔记之【map之移除元素】

    //---------------------------------------------------------// 移除map中满足条件的元素//----------------------- ...