SSL的TCP通信

一切尽在代码中,额,自己测试的小例子,感觉很有用,做个记录。

服务器端:

</pre><pre name="code" class="java">package com.mpc.test.clazz;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.TrustManagerFactory;public class SSLTest {public static void main(String[] args) throws Exception {String key = "d:/keys/m.jks";// 定义服务器端要使用的证书String trust = "d:keys/trustclient.jks";// 定义服务器端要信任的证书/* 个人感觉,上面这两个属性在使用的时候完全可以定义为properties文件或者xml文件来使用 */KeyStore keyStore = KeyStore.getInstance("JKS");// 定义一个KeyStore用来存储服务器的秘钥文件keyStore.load(new FileInputStream(key), "123456".toCharArray());// 加载服务器端使用的证书,当然要输入要打开加密文件的密码了KeyStore trustStore = KeyStore.getInstance("JKS");// 定义一个KeyStore用来存储服务器信任的证书文件trustStore.load(new FileInputStream(trust), "123456".toCharArray());// 加载服务器端信任的证书文件,当然也要输入密码的/** 额,其实keyStore和truststore都是Keystore的大家都看到了,就是保存的秘钥文件不同而已了 */KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());/** 创建一个服务器的秘钥管理工厂,KeyManagerFactory.* getDefaultAlgorithm* ()是指定的默认的算法,记得是RSA··输出一下就OK了*/kmf.init(keyStore, "mipengcheng".toCharArray());/** 初始化,在初始化的时候需要自定秘钥的密码,* 这个在创建的时候指定的*/TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());/** 创建一个服务器信任证书的管理工厂* ,* 同样指定了RSA的算法*/tmf.init(trustStore);/* 初始化,由于信任的是证书,不是秘钥,所以不用指定密码什么的了 */SSLContext sslc = SSLContext.getInstance("TLSv1");/** 获得TLSv1版本的SSLContext,* 还有个ssl3的*/sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),new SecureRandom());/* 用两个工厂来初始化SSLContext */SSLServerSocketFactory sllFactory = sslc.getServerSocketFactory();/* 获得服务器端口工厂 */SSLServerSocket serverSocket = (SSLServerSocket) sllFactory.createServerSocket(9999);/* 创建serverSocket,在9999端口监听 *//* 这句很重要,是要开启客户端的安全证书验证滴 */serverSocket.setNeedClientAuth(true);System.out.println("服务器已经启动了........");while (true) {final Socket socket = serverSocket.accept();/** accept用来阻塞监听线程,访问一个处理一个*/System.out.println("接收到" + socket.getRemoteSocketAddress() + "的请求");new Thread(new MyThread(socket)).start();/* 创建新的线程用来处理接受到的socket */}}static class MyThread implements Runnable {private Socket socket;public MyThread(Socket socket) {super();this.socket = socket;}public void run() {/** 这里是对接受的请求的处理,没什么东西了。 */try {System.out.println("服务器开始读取数据=====");BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(),true);String message;while (null != (message = read.readLine())) {if (message.equals("end")) {out.println("agree");break;} else {System.out.println("结果" + message);out.println("服务器收到消息");}}System.out.println("服务器跳出循环");Thread.sleep(10000);out.close();read.close();} catch (Exception e) {e.printStackTrace();}}}
}

客户端:

package com.mpc.test.clazz;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.KeyStore;
import java.security.SecureRandom;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;public class SSLTestClient {public static void main(String[] args) throws Exception {/* 从这里开始======== */String key = "d:/keys/trustm.jks";String client = "d:/keys/client.jks";KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(new FileInputStream(key), "123456".toCharArray());KeyStore clientStore = KeyStore.getInstance(KeyStore.getDefaultType());clientStore.load(new FileInputStream(client), "123456".toCharArray());TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(clientStore, "123456".toCharArray());SSLContext sslc = SSLContext.getInstance("TLSv1");sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),new SecureRandom());/* 到这里结束======== *//** 上面注释包围的内容,和服务器端的一样,只是这里变成了客户端要使用的秘钥,客户端要信任的证书 */SSLSocketFactory sslSocketFactory = sslc.getSocketFactory();/* 获得socketFactory */SSLSocket socket = (SSLSocket) sslSocketFactory.createSocket("127.0.0.1", 9999);/* 访问本机的9999端口 */socket.setKeepAlive(true);/*长连接···*//*下面都是消息的处理,没什么东西了*/BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println("cilent message");String message;int i = 0;while (null != (message = read.readLine())) {System.out.println(message);i++;if (message.equals("agree")) {break;} else {}Thread.sleep(1000);out.println("cilent message");if (i == 5) {out.println("end");}}socket.close();out.close();read.close();System.out.println("客户端跳出了while循环");}
}


测试结果:

1.服务器端:


2.客户端:


在项目中使用到的证书


关于证书的创建,这里以服务器端的秘钥的创建和服务器要给客户端使用的信任证书的创建为例:

使用jdk自带的keytool来创建。

D:\keys>keytool -genkeypair -alias mkey -keyalg RSA -validity 7 -keystore m.jks
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?[Unknown]:  mi
您的组织单位名称是什么?[Unknown]:  my
您的组织名称是什么?[Unknown]:  isis
您所在的城市或区域名称是什么?[Unknown]:  city
您所在的省/市/自治区名称是什么?[Unknown]:  state
该单位的双字母国家/地区代码是什么?[Unknown]:  china
CN=mi, OU=my, O=isis, L=city, ST=state, C=china是否正确?[否]:  y输入 <mkey> 的密钥口令(如果和密钥库口令相同, 按回车):
再次输入新口令:

使用第一行的命令来生成证书,指定名字为m.jks;然后根据提示就可以创建服务器端的秘钥了。


D:\keys>keytool -export -alias mkey -keystore m.jks -rfc -file rootca.cer
输入密钥库口令:
存储在文件 <rootca.cer> 中的证书


这条命令导出了服务器端的证书文件,用来供其他客户端验证服务器。但是java貌似不用这个,所以在把它导成jks的。


D:\keys>keytool -import -alias mcer -file rootca.cer -keystore trustm.jks
输入密钥库口令:
再次输入新口令:
所有者: CN=mi, OU=my, O=isis, L=city, ST=state, C=china
发布者: CN=mi, OU=my, O=isis, L=city, ST=state, C=china
序列号: 2ed10bf7
有效期开始日期: Wed Jan 27 16:24:15 CST 2016, 截止日期: Wed Feb 03 16:24:15 CST
2016
证书指纹:MD5: 44:3A:CB:4D:B3:BE:FF:63:67:61:0C:19:97:DA:02:09SHA1: 5E:D2:48:8F:37:29:00:94:99:AB:A1:93:B0:1F:2E:65:74:39:06:50SHA256: 98:B3:62:6F:3A:77:F5:9E:BA:29:A8:55:16:E7:47:92:79:ED:45:26:E9:
7F:A8:ED:88:82:89:AA:FD:4C:3A:35签名算法名称: SHA256withRSA版本: 3扩展:#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B0 51 15 9A E5 2F 8A 29   D2 4E 15 AE 0B 86 83 13  .Q.../.).N......
0010: EE BC 7B E2                                        ....
]
]是否信任此证书? [否]:  y
证书已添加到密钥库中

这条命令就把服务器端给客户端验证的证书的jks文件生成了。


客户端的相关秘钥,证书的生成也是一样的。


本人才疏学浅,只是想折腾折腾,学习学习,如果有什么不对的,不足的地方,还请大家包涵,指教!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java反射的使用概览

额&#xff0c;研究过这个的人很多很多&#xff0c;但是我没有很深入的研究过&#xff0c;所以谁也拦不住我去研究研究&#xff0c;然后记录下来如有雷同那就雷同了请多多包涵。 首先是整个项目的结构&#xff1a; 使用到的类&#xff1a; package reflect.demo;public class D…

moodle3.7中文语言包

Moodle官方有中文语言包&#xff0c;但是还有没有翻译的&#xff0c;为了提高用户体验&#xff0c;可以将部分未翻译的应用在Moodle网站管理中自己修改。 具体步骤&#xff1a; 先确定需要修改的关键字&#xff0c;也就是网站中没有翻译成中文的文字在centos中定位到moodle网站…

Spring项目中使用webservice实现h5的websocket通信

一、在项目中建立一个webservice来做后台操作。 package org.calonlan.soulpower.websocket;import java.text.SimpleDateFormat; import java.util.Date;import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.we…

[连载型] Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的...

问题导读&#xff1a;1.Nova安全组是什么&#xff1f;2.Nova的是如何配置的?3.FWaas是什么&#xff1f;1. Nova 安全组1.1 配置 节点配置文件配置项说明controller/etc/nova/nova.confsecurity_group_api nova是的 nova secgroup* 命令使用的是 nova 安全组的 API/etc/neutro…

LeetCode题解

题目是这样的&#xff1a;一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。问总共有多少条不同的路径&a…

java获得指定的开始时间与结束时间之间的所有日期

import java.text.SimpleDateFormat; import java.util.Calendar;public class TimerTest {public static void main(String[] args) throws Exception {String beginDate "2016-07-16";//开始时间String endDate "2016-07-25";//结束时间SimpleDateForm…

linux中umask的使用

在linux创建文件、文件夹的时候会给它们赋予默认的权限&#xff0c;这个默认权限的赋予就是和umask相关的。总结如下&#xff1a; 1&#xff1a;x 执行 2&#xff1a;w 写入 4&#xff1a;r 读取 文件创建的时候的权限为 666与umask的每一位对应相减&#xff1b;如 umask 为…

spring boot 与redis 整合

创建项目时需要导入的包 在application.yml 配置文件中配置需要的 spring:datasource:url: jdbc:mysql://localhost:3306/数据库名?useSSLfalse&serverTimezoneAsia/Shanghaiusername: 用户名password: 密码jpa:show-sql: truehibernate:ddl-auto: none #redis 可以不配,默…

Http长连接的例子_亲测可用哦

一、什么事Http长连接&#xff1a;在网上有很多很多关于Http长连接的文章&#xff0c;但是我看了很多都看不懂。自己总结的所谓的http长连接就是在一请求一个页面后&#xff0c;在服务器端不断开http连接&#xff0c;而是通过response一直在定时的往页面客户端刷新数据。 二、s…

不同操作系统上DNS客户端操作区别汇总

结论&#xff1a;windows有DNS缓存&#xff0c;Linux默认无DNS缓存&#xff0c;只能依赖于安装其他软件。 一、不同操作系统的客户端的DNS缓存差别 1、windows 系统中dns 解析器会使用系统的dns缓存来提高dns域名解析效率。 例如&#xff1a; 查看当前的dns cache内容&#xff…

SLAM学习心得——建图

1.建图 我们所谓的地图&#xff0c;即所有路标点的集合。一旦我们确定了路标点的位置&#xff0c;那就可以说我们完成了建图。 地图的作用&#xff1a;&#xff08;1&#xff09;定位 &#xff1b;&#xff08;2&#xff09;导航&#xff1b; &#xff08;3&#xff09;避障&am…

spark2

特点 通用 批处理 迭代式计算 交互查询 流处理 组件 spark core:任务调度 内存管理 容错机制 内部定义了RDDs 提供了很多API &#xff0c;为其他组件提供底层的服务 spark sql&#xff1a;报表统计 streaming :从kafka接收数据做实时统计 mlib&#xff1a;mll 支持横向扩展&am…

spark 监控--WebUi、Metrics System(转载)

转载自&#xff1a;https://www.cnblogs.com/barrenlake/p/4364644.html Spark 监控相关的部分有WebUi 及 Metrics System; WebUi用于展示Spark 资源状态、Metrics System 整合的指标信息。 Ui相关流程 Spark集群启动之后&#xff0c;我们可以通过Web观察集群状态等信息&#x…

Hadoop64位版本安装后遇到的警告处理

在使用hadoop的过程中&#xff0c;会遇到一个警告&#xff0c;内容如下&#xff1a; WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 对于这个问题网上很多说法是由于系统位数和所下载…

ueditor跨域上传图片文件(基于jsp框架、tomcat)

额&#xff0c;好久没有用到ueditor了&#xff0c;因为现在的相关工作很少涉及到富文本编辑&#xff1b;最近临时带了一个项目&#xff0c;里面要用到富文本编辑器&#xff0c;而且文件要统一上传到文件服务器上保存&#xff1b;应为以前用过ueditor就试着在网上着一些跨域保存…

精选Pycharm里6大神器插件

http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐&#xff0c;有小伙伴提议再来一篇Pycharm的主题。相比Sublime&#xff0c;Pycharm要强大许多&#xff0c;而且是专为python设计的集成开发环境&#xff0c;所以无论是自身功能、环境配置还是使用…

数字信号处理实验(一)——DTFT

一、离散序列傅里叶变化——DTFT 1、DTFT公式 2、Matlab算法实现 function[X]dtft(x,n,w,flag)%计算离散时间付里叶变换 %[X]dtft(x,n,w) %X在w频率点上的DTFT数组 %xn点有限长度序列 %n样本位置向量 %w频率点位置向量X x * (exp(-j).^(n * w));3、DTFT一些画图代码 function …

修改hadoop中yarn的webui中显示的任务时间为中国时间

在${HADOOP_HOME}\share\hadoop\yarn目录下找到hadoop-yarn-common-x.x.x.jar&#xff0c;然后用winRAR打开&#xff1b; 打开以后结构如下&#xff1a; 进入webapps/static/目录&#xff0c;然后修改yarn.dt.plugins.js&#xff1b;做出如下修改&#xff1a; &#xff08;1&a…

Trident API 概览

Trident API 概览 在网上看到了很多有TRIDENT相关API的翻译&#xff0c;看来看去&#xff0c;总觉得没有说清楚很多东西&#xff0c;所以自己结合使用的经验翻译了一篇出来&#xff1b;翻译完以后&#xff0c;也发现 在自己的翻译中也有很多地方是表达不清楚的不过多少感觉有些…

Trident State译文

Trident State 译文 Trident针对状态化的数据源的读写进行了一流的分装。State可以包含在拓扑中-例如&#xff0c;保存在内存中&#xff0c;有HDFS提供备份-也可以保存在一个外部的数据库中&#xff0c;像Memcached和Cassandra。针对以上的所有情况&#xff0c;Trident的API都…