网络传输是存在风险的,因此对服服务端和客户端进行安全校验和传输信息的加密就显得非常的重要。

上面一句有点拗口,简单解释如下文:

当客户使用SSL向站点服务器发送请求时,服务器向客户端发送一个证书,客户使用已安装的证书,验证服务器身份,然后检查IP地址(主机名)与客户端连接的主机是否匹配。客户生成可以用来对话的私钥(称为会话密钥),然后用服务者的公钥对它进行加密并将它发送到服务者。服务者用自己的私钥解密,然后用该信息和客户端一样的私有会话密钥。通常在这个阶段使用RSA算法。 随后,客户端和服务器端使用私有会话密钥和私钥算法(通常是RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。

接下来,就一一介绍下如何进行SSL加密的socket通信开发

一、创建服务端密钥

命令行执行

keytool.exe -genkeypair -v -alias sslsocket -keyalg RSA -keystore e:\sslsocket.keystore

出现提示输入密码

输入keystore密码:

再次输入新密码:

您的名字与姓氏是什么?

[Unknown]: lwx

您的组织单位名称是什么?

[Unknown]: newland

您的组织名称是什么?

[Unknown]: bomc

您所在的城市或区域名称是什么?

[Unknown]: fz

您所在的州或省份名称是什么?

[Unknown]: fj

该单位的两字母国家代码是什么

[Unknown]: zh

CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh 正确吗?

[否]: y

上述信息只是为了帮助客户端校验服务端证书的信息,测试的时候只需要注意最后提示是否正确的时候 输入y 即可。

接着出现下面信息

正在为以下对象生成 1,024 位 RSA 密钥对和自签名证书 (SHA1withRSA)(有效期为 90天

):

CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh

输入的主密码

(如果和 keystore 密码相同,按回车):

[正在存储 e:\sslsocket.keystore]

生成密钥sslsocket.keystore后,可以通过下面的命令来查看

keytool -list -v -keystore e:\sslsocket.keystore -storepass 123456

看到的信息就是之前我们输入的内容了

Keystore 类型: JKS

Keystore 提供者: SUN

您的 keystore 包含1输入

别名名称: sslsocket

创建日期:2013-5-8项类型: PrivateKeyEntry

认证链长度:1认证 [1]:

所有者:CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh

签发人:CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh

序列号:5189a30d

有效期: Wed May 08 08:57:49 CST 2013 至Tue Aug 06 08:57:49 CST 2013证书指纹:

MD5:51:5E:1A:57:1B:B9:18:3A:9B:05:F7:13:E5:06:AB:F0

SHA1:11:0E:C8:8B:46:1F:27:FA:12:95:95:4E:1E:29:E7:27:50:2E:E9:48签名算法名称:SHA1withRSA

版本:3

二、生成服务端证书

keytool.exe -exportcert -v -alias sslsocket -file e:\sslsocket.cer -keystore e:\sslsocket.keystore

e:\sslsocket.cer 即我们服务端的证书,到这里应该就比较熟悉了查看证书信息的命令

keytool.exe -printcert -v -file e:\sslsocket.cer

出现的结果如下

所有者:CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh

签发人:CN=lwx, OU=newland, O=bomc, L=fz, ST=fj, C=zh

序列号:5189a30d

有效期: Wed May 08 08:57:49 CST 2013 至Tue Aug 06 08:57:49 CST 2013证书指纹:

MD5:51:5E:1A:57:1B:B9:18:3A:9B:05:F7:13:E5:06:AB:F0

SHA1:11:0E:C8:8B:46:1F:27:FA:12:95:95:4E:1E:29:E7:27:50:2E:E9:48签名算法名称:SHA1withRSA

版本:3

三、生成客户端密钥

有了服务端证书之后,自然就是通过密码来生成客户端的密钥了,命令如下

keytool.exe -importcert -v -alias sslsocketcer -file e:\sslsocket.cer -keystore e:\sslclient.keystore

e:\sslclient.keystore 就是客户端的密钥了。

关于keytool的更多信息可以参考这里:http://blog.chinaunix.net/uid-17102734-id-2830223.html

四、开发程序

为了测试 我将服务端和客户端的证书放到工程目录下

服务端代码

1 /**

2 *@authordraem0507@gmail.com3 * @TODO java线程开发之四 SSL加密4 * 开发步骤5 * 1.生成服务端密钥6 * 2.导出服务端证书7 * 3.生成客户端密钥8 * 4.程序开发测试9 * 关于证书的生成请参考readme.txt10 * 参考资料:http://chrui.iteye.com/blog/1018778

11 *@version1.012 * @date 2013-5-7 23:22:4513 * @update 2013-5-8 10:22:4514 * @blgoshttp://www.cnblogs.com/draem0507

15 */

16

17 public classServerTest {18 privateServerSocket serverSocket;19 private final static char[] password="123456".toCharArray();20 privateSSLContext context;21 URL url = Thread.currentThread().getContextClassLoader().getResource("sslsocket.keystore");22 String path =url.toString();23 privateInputStream inputStream;24

25

26 publicServerTest() {27 inputStream=this.getClass().getResourceAsStream("/sslsocket.keystore");28 initContext();29 try{30 //直接运行会报 javax.net.ssl.SSLException:31 //ServerSocketFactory factory= SSLServerSocketFactory.getDefault();

32 ServerSocketFactory factory=context.getServerSocketFactory();33 //serverSocket = new ServerSocket(10000);

34 serverSocket=factory.createServerSocket(10000);35 while (true) {36 Socket socket =serverSocket.accept();37 newReceiveSocket(socket).start();38 }39 } catch(IOException e) {40 //TODO Auto-generated catch block

41 e.printStackTrace();42 }43

44 }45

46 //ssl 上下文对象的初始化

47 private voidinitContext() {48 try{49 KeyStore store=KeyStore.getInstance("JKS");50 store.load(inputStream, password);51 KeyManagerFactory factory=KeyManagerFactory.getInstance("SunX509");52 factory.init(store,password);53 KeyManager []keyManagers=factory.getKeyManagers();54 context=SSLContext.getInstance("SSL");55 context.init(keyManagers, null , null);56 } catch(KeyStoreException e) {57 //TODO Auto-generated catch block

58 e.printStackTrace();59 } catch(NoSuchAlgorithmException e) {60 //TODO Auto-generated catch block

61 e.printStackTrace();62 } catch(CertificateException e) {63 //TODO Auto-generated catch block

64 e.printStackTrace();65 } catch(FileNotFoundException e) {66 //TODO Auto-generated catch block

67 e.printStackTrace();68 } catch(IOException e) {69 //TODO Auto-generated catch block

70 e.printStackTrace();71 } catch(UnrecoverableKeyException e) {72 //TODO Auto-generated catch block

73 e.printStackTrace();74 } catch(KeyManagementException e) {75 //TODO Auto-generated catch block

76 e.printStackTrace();77 }78

79 }80

81 public static voidmain(String[] args) {82 newServerTest();83

84 }85

86 private class ReceiveSocket extendsThread {87 privateSocket socket;88

89 publicReceiveSocket(Socket socket) {90 this.socket =socket;91 }92

93 privateObjectInputStream reader;94 privateObjectOutputStream writer;95

96 @Override97 public voidrun() {98

99 try{100 reader=new ObjectInputStream(newBufferedInputStream(socket.getInputStream()));101 //writer=new ObjectOutputStream(socket.getOutputStream());102 //开启无限循环 监控消息103

104 //java.io.EOFException

105 Object obj=reader.readObject();106 if(obj!=null)107 {108 User user =(User)obj;109 System.out.println("id=="+user.getId()+"\tname=="+user.getName());110 }111 //while (true) {}

112

113 } catch(IOException e) {114 //TODO Auto-generated catch block

115 e.printStackTrace();116 } catch(ClassNotFoundException e) {117 //TODO Auto-generated catch block

118 e.printStackTrace();119 } finally{120 if (null !=reader) {121 try{122 reader.close();123 } catch(IOException e) {124 //TODO Auto-generated catch block

125 e.printStackTrace();126 }127 }128 if (null !=writer) {129 try{130 reader.close();131 } catch(IOException e) {132 //TODO Auto-generated catch block

133 e.printStackTrace();134 }135 }136 try{137 socket.close();138 } catch(IOException e) {139 //TODO Auto-generated catch block

140 e.printStackTrace();141 }142 }143

144 }145

146 }147

148 }

客户端代码

1 public classClientTest {2 private final static char[] password="123456".toCharArray();3 private staticSSLContext context;4 static InputStream inputStream=ClientTest.class.getResourceAsStream("/sslclient.keystore");5

6 public static void main(String[] args) throwsException {7

8 KeyStore ts = KeyStore.getInstance("JKS");9 ts.load(inputStream, password);10 TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");11 tmf.init(ts);12 TrustManager [] tm =tmf.getTrustManagers();13 context = SSLContext.getInstance("SSL");14 context.init(null, tm, null);15

16 //SocketFactory factory= SSLSocketFactory.getDefault();17 //Socket socket =factory.createSocket("localhost", 10000);

18 SocketFactory factory=context.getSocketFactory();19 SSLSocket socket=(SSLSocket) factory.createSocket("localhost", 10000);20

21

22 //ObjectInputStream in=new ObjectInputStream(socket.getInputStream());

23 ObjectOutputStream out=newObjectOutputStream(socket.getOutputStream());24

25

26 User user =newUser();27 user.setId(1);28 user.setName("lwx_"+1);29 out.writeObject(user);30 out.flush();31

32

33 socket.close();34

35

36 }37 }

如果想要源码的话,可以到这里来下载 http://download.csdn.net/detail/draem0507/5343534

java ssl 加密传输_java线程之四 SSL加密传输相关推荐

  1. java连接qq邮箱_java如何使用ssl连接qq邮箱

    展开全部 Gmail目前已经启用了POP3和SMTP服务,与其他邮箱不同的是Gmail提供e68a84e8a2ad62616964757a686964616f31333335303464的POP3和S ...

  2. java ssl 无证书_java – 如何修复SSL – 没有可用的证书

    我想使用以下代码建立服务器SSL套接字连接: int port = 12000; ServerSocketFactory ssocketFactory = SSLServerSocketFactory ...

  3. java 文件 加解密_Java实现文件的加密解密功能示例

    Java实现文件的加密解密功能示例 发布时间:2020-10-05 22:05:15 来源:脚本之家 阅读:86 作者:FC WORLD!!! 本文实例讲述了Java实现文件的加密解密功能分享给大家供 ...

  4. java 同步转并行_Java线程与并行编程(二)

    你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...

  5. java方法生命周期_Java线程的第二种实现方式以及生命周期

    上篇中我们了解了Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步, ...

  6. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  7. java用NIO实现文件传输_Java Nio 实现文件的传输

    使用Java Nio实现文件的传输 1.ServerSocket.java package ch2; import java.io.File; import java.io.FileNotFoundE ...

  8. java后台开发加密程序_Java后端实现MD5加密的方法

    前言 在我们开发是要考虑这个功能,当用户忘记密码的情况下,我们需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密码.让用户再去修改密码. 同时在数 ...

  9. java 16进制_JAVA十六进制数据接收与传输

    由于项目中经常遇到与设备进行交互获取数据,不仅有Python版本.还有Java版本,还可能会有C#版本,在此做个记录. 一.十六进制转换工具类 主要包含十六进制字符串转ASCII,ASCII转十六进制 ...

最新文章

  1. 基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法
  2. 我国自主研发手机操作系统 960 OS 发布
  3. Dotween的timeScale
  4. 过年不回家,压岁钱、份子钱省下来了吗?
  5. java js 解析器_graphqljs具有多个参数的解析器
  6. MVC登陆认证简单设置
  7. 据说200G网盘资料
  8. 记录自己装Ubuntu18.04+Win10 1803双系统,采用UEFI启动模式
  9. Vue人资中台--打包上线
  10. android数据恢复实现,5款免费的Android数据恢复应用
  11. 网易邮箱服务器邮箱协议,网易邮箱全面支持Exchange协议
  12. 诺基亚系列手机型号命名研究(转)
  13. 什么是软件工程?它有哪些本质特征?怎样用软件工程消除软件危机?
  14. 如何使用JavaScript实现前端导入和导出excel文件(H5编辑器实战复盘)
  15. Runnable小练习(网图下载)
  16. 调侃腾讯和360的小段子
  17. Charles 抓包夜神模拟器,实现对App网络请求的监控
  18. 【ARM裸机s5pv210 】芯片初始化
  19. 【目标检测】Anchor Free —— OneNet(不需要NMS)
  20. 网络虚拟化——SR-IOV

热门文章

  1. wamp新建虚拟目录无法运行的解决方法
  2. 如何weak link一个framework (高版本兼容低版本)
  3. 我的第一个C++程序——方块游戏 v1.0
  4. 【摘】把vmware的虚拟机硬盘vmdk文件分割成多个2G文件
  5. 去除面部黑色素小妙招_去除暗黄皮肤的小妙招 7招让你白皙动人
  6. android 测试工具,安卓测试工具的几种实现方式
  7. outlook可以显示多少行文本_Linux学习从处理文本开始
  8. C4D双十一促销海报模板,参考一下!
  9. UI使用素材模板|login登录界面
  10. 值从哪里来_内存频率是怎么算出来的?2133MHz这么奇怪的数字是怎么来的?