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. 使用 HTML5 input 类型提升移动端输入体验(键盘)

    在最近的项目中,策划老是要求我们弹出各种类型的键盘,特别是在iOS下,例如输入帐号的时候,不应该支持输入中文,该输入纯数字的时候就应该谈数字键盘等.个人觉得这些都是我们平时开发很少意识到的,虽然有些刁 ...

  2. Java&&As3.0 中的final 关键字

    Java和AS3.0关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.   可以修饰的对象:   fin ...

  3. PHP中json序列化后中文的编码显示问题

    在接口返回数据中,我们经常会返回json或者xml格式,php的json序列化函数json_encode非常好用,但是默认会把中文编码为ASCII码(注意,很多人认为这是乱码,其实不是),尤其在调试接 ...

  4. spring @Component

    使用 @Component <context:component-scan base-package="dao" />   虽 然我们可以通过@Autowired或@R ...

  5. POJ 2387

    最短路模板 dij 和 spfa 都可以 spfa: #include<stdio.h> #include<string.h> #include<cstring> ...

  6. Monad / Functor / Applicative 浅析

    前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...

  7. 基础-JavaScript中的事件

    在html中引入外部js方式: <html> <head> <script src="xxx.js"></script> </ ...

  8. 关于:hover的一点小问题

    今天又用到了:hover这个伪类选择器,一个小问题搞了我好久,就是关于:hover选择的问题, 先看下css代码 .box:hover span { height: 150px; } 接下来是HTML ...

  9. js 基础对象一

    JavaScript 通常用于操作 HTML 元素. Document元素 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页 ...

  10. Hibernate 乐观锁(Optimistic Locking)

    1.hibernate基于数据版本(Version)记录机制实现.为数据增加一个版本标识,一般是通过为数据库表增加一个"version"字段来实现. 读取出数据时,将此版本号一同读 ...