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-ArrayList使用技巧---从第一个List中去除所有第二个List中与之重复的元素

需求&#xff1a;从 mAllList 中去除所有 mSubList 中与之重复的元素 测试数据&#xff1a;mAllList 中包含100000个无序无重复字符串&#xff0c;mSubList 中包含50000个无序无重复字符串 方法一、ArrayList中提供的removeAll方法&#xff08;效率最低&#xff09; mAllList.r…

JAVA对时间的几个处理小方法

获得两天之间相差的天数。 private static int daysBetween(Date date1, Date date2) {Calendar cal Calendar.getInstance();cal.setTime(date1);long time1 cal.getTimeInMillis();cal.setTime(date2);long time2 cal.getTimeInMillis();long between_days (time2 - time…

java反射的使用概览

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

moodle3.7中文语言包

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

如何在视图中启用thymeleaf

在HTML标签中引入一个属性 1 <html xmlns:th"http://www.thymeleaf.org"> 转载于:https://www.cnblogs.com/q2546/p/11093852.html

pushlet单播与多播

最近要弄一个消息推送的功能&#xff0c;在网上找了很多的关于pushlet的文章&#xff0c;虽然写的都很详细&#xff0c;但是本人看了以后却总觉得是模棱两可不知道如何下手&#xff0c;最终参考了这些文章中的一些内容&#xff0c;并结合官网的源代码&#xff0c;做了自己的修改…

两个小程序大概的了解一下java的线程

一、java的notify与wait package org.calonlan.soulpower;public class MyThreadTest implements Runnable {private String name;private Object prev;private Object self;public MyThreadTest(String name, Object prev, Object self) {super();this.name name;this.prev …

HttpContext HttpRuntime

问题引出 HttpContext.Current.Cache .VS. HttpRuntime.Cache HttpRuntime.Cache&#xff1a;获取当前应用程序的CacheHttpContext.Current.Cache&#xff1a;为当前HTTP请求获取Cache对象&#xff0c;跨线程可用&#xff0c;在APM模式或创建了子线程的场景中不能用HttpContext…

sudo apt-get常用命令

一、卸载 1. sudo apt-get autoclean 如果你的硬盘空间不大的话&#xff0c;可以定期运行这个程序&#xff0c;将已经删除了的软件包的.deb安装文件从硬盘中删除掉。如果你仍然需要硬盘空间的话&#xff0c;可以试试apt-get clean&#xff0c;这会把你已安装的软件包的安装包也…

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…

c++简单桶排序

c简单桶排序 题目一样&#xff0c;还是排序 桶排序是排序算法里比较快的 代码 注释 #include <bits/stdc.h> using namespace std; int main() {int b[100];//b[]的大小是你排的数字的最大值 1 int n;int k;memset(b,0,sizeof(b));//把b[]数组清零 cin >> n;for…

[连载型] 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…

linux命令笔记

alias 查看或设置别名。 ualias 取消别名。 mkdir -p 创建目录及子目录。 vi/vim 编辑器。 seq -s 生成数字序列。 yum 解决linux下包管理工具rpm的安装软件依赖问题&#xff0c;例如&#xff1a;yum install lrzsz -y。 cp -apr 拷贝文件或目录。 tree -Ld打印目录结构…

LeetCode题解

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

Mysql的执行顺序与优化分析

编写顺序与执行顺序分析 一条完整的sql语句编写流程应该如下&#xff1a; select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 group by 分组字段 having 分组后条件 order by 排序条件 limit 查询起始位置, 查询条数 但是在mysql实…

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 为…

jieba中文分词源码分析(四)

一、未登录词问题在jieba中文分词的第一节曾提到未登录词问题 中文分词的难点 分词规范&#xff0c;词的定义还不明确 (《统计自然语言处理》宗成庆)歧义切分问题&#xff0c;交集型切分问题&#xff0c;多义组合型切分歧义等 结婚的和尚未结婚的 > 结婚&#xff0f;的&…

hadoop2.4.2集群搭建及hive与mysql集成文档记录

1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机&#xff08;如华为用主机、阿里云主机等&#xff09;/etc/hosts里面要配置的是内网IP地址和主机名的映射关系4.关闭防火墙5.ssh免登陆6.安装JDK&#xff0c;配…

mybatis使用过程遇到的一些问题及解决方法

1.传入string单个参数进行判断是 要使用 <if test"_parameter ! null"></if> 2.mybatis批量插入 <insert id"insertSerily" parameterType"java.util.List"> insert into sys_role_resource (id, role_id, resource_id ) valu…