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. Underscore.js 的模板功能介绍与应用

    Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能,需要了解的朋友可以详细参考下   U ...

  2. Flex4 flashVars 传值

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

  3. IntelliJ IDEA 2016.1.3激活【亲测可用】

    测试日期:2016.6.24 License server: http://www.iteblog.com/idea/key.php // ========================= 更多技术 ...

  4. select用法

    每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...

  5. 获取Excel数据(或部分数据)并导出成txt文本格式

    运行代码前先导入jxl架包,以下代码仅供参考: 测试excel文件(我要获取该excel的内容为省.县.乡.村.组和PH的值): ExcelTest01类代码如下: // 读取Excel的类 impo ...

  6. Hibernate 系列教程15-一级缓存

    Product public class Product { private Long id; private String name; Product.hbm.xml <class name= ...

  7. GameUnity 2.0 文档(三) 纸片人八方向

    DirectSprite类 有别于 上篇文档出现的 AnimationSprite类 (从头播放到尾) 这个类根据 path的图,如果是 8*8 64个图 八方向,可以设置长宽和 角度 角度 代表 8 ...

  8. CSS小例收藏

    body { background-color: #e8dabf; background-image: url(img/bg.png), url(img/bg_tile.png); backgroun ...

  9. 学习笔记——抽象工厂模式Abstract Factory

    在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂. 依然以<真菌世界>游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米 ...

  10. EL表达式,保留小数点后两位

    你遇到过页面显示小数有9.987870488E9这个吗? 这是因为没有保留小数的原因 有时候用js保留小数很麻烦的时候,可以用EL表达式 <fmt:formatNumber type=" ...