Java SSL Socket通讯示例

上一篇《OpenSSL与KeyStore指令小集》里面说到,最近研究SSL加密,会给出一个Java的小示例。复制一份可以运行的代码到生产上是非常不负责任的行为,不过小示例可以带我们入门,快速看清事物的本质。罗马不是一天建成的。

本文将给出一个Java SSL Socket的小例子,包括了Server和Client。希望大家上手之后,要多去研究相关的资料,理解基础概念。Java的优点是封装得比较彻底,需要介入的地方比较少,缺点是随着Java版本的升级和发展,会有很多新的概念和类涌出来,都要搞清楚要费不少力,另外代码量也比较大(生产级别的代码)。

具体代码

从最简单来说,Java里面只需要配置几个系统属性,创建及调用几个SSL相关的对象即可。这四个属性分别是:

  • javax.net.ssl.keyStore

    本方的密码,证书等存放地点(KeyStore文件地址)。

  • javax.net.ssl.keyStorePassword

    KeyStore的密码。没有密码可以不填。

  • javax.net.ssl.trustStore

    受信任证书的存放地点(TrustKeyStore文件地址)。

  • javax.net.ssl.trustStorePassword

    TrustKeyStore的密码。没有密码可以不填。

KeyStore类型默认是JKS类型的,不是的话,还需要设置 javax.net.ssl.keyStoreType和javax.net.ssl.trustStoreType。

Server端代码

每一次收新的连接,都新开一个线程接待。生产上请用线程池等技术。更推荐用Netty或Mina等框架处理。

public class SslServer {
		public static void main(String[] args) throws Exception {
			System.setProperty("javax.net.debug", "ssl,handshake");

			System.setProperty("javax.net.ssl.keyStore", "./cfg/server.jks");
			System.setProperty("javax.net.ssl.keyStorePassword", "123456");
			System.setProperty("javax.net.ssl.trustStore", "./cfg/clienttrust.jks");
			System.setProperty("javax.net.ssl.trustStorePassword", "123456");

			SSLServerSocketFactory serverSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory
					.getDefault();
			SSLServerSocket serverSocket = (SSLServerSocket) serverSocketFactory
					.createServerSocket(9100);
			// 要求客户端身份验证
			serverSocket.setNeedClientAuth(true);

			while (true) {
				SSLSocket socket = (SSLSocket) serverSocket.accept();
				Accepter accepter = new Accepter(socket);
				accepter.service();
			}
		}

		static class Accepter implements Runnable {
			private SSLSocket socket;

			public Accepter(SSLSocket socket) {
				this.socket = socket;
			}

			public void service() {
				Thread thread = new Thread(this);
				thread.start();
			}

			@Override
			public void run() {
				try {
					InputStream inputStream = socket.getInputStream();

					InputStreamReader inputstreamreader = new InputStreamReader(
							inputStream);
					BufferedReader bufferedreader = new BufferedReader(
							inputstreamreader);

					String string = null;
					while ((string = bufferedreader.readLine()) != null) {
						System.out.println(string);
						System.out.flush();
					}
				} catch (Exception e) {
					// replace with other code
					e.printStackTrace();
				}
			}
		}
	}

Client代码

建立连接,并发一个消息给Server。很简单。记得换行符以及调用flush方法。

public class SslClient {
		public static void main(String[] args) throws Exception {
			System.setProperty("javax.net.debug", "ssl,handshake");

			System.setProperty("javax.net.ssl.keyStore", "./cfg/client.jks");
			System.setProperty("javax.net.ssl.keyStorePassword", "123456");
			System.setProperty("javax.net.ssl.trustStore", "./cfg/servertrust.jks");
			System.setProperty("javax.net.ssl.trustStorePassword", "123456");

			SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
					.getDefault();
			SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
					"127.0.0.1", 9100);

			OutputStream outputStream = sslsocket.getOutputStream();
			BufferedWriter bufferedWriter = new BufferedWriter(
					new OutputStreamWriter(outputStream));
			bufferedWriter.write("沉睡的雄狮\n");
			bufferedWriter.flush();

			TimeUnit.SECONDS.sleep(2000);
		}
	}

结束语

JDK后来加了SSLEngine这个类,具有异步通讯的能力。不过看官方文档,给出的代码很长。还是那句话,有条件的推荐用Netty或者Mina来处理通讯的问题,应该会比自己写的性能好一些。

Java官方SSL Socket文档

时间: 2024-10-16 07:30:21

Java SSL Socket通讯示例的相关文章

html面页与JAVA通过Socket 通讯

(原) 往常前后端通讯基本都是以ajax请求或是表单做数据交互的,这是一种无状态的http协议,如果要做tcp协议的数据交互,能想到的技术也就socket了,可如果后端是JAVA,前端如何做socket呢,其实这里用JSP就行,其实这里如果都用JDK自带的socket client 和 socket server 就OK了,如果换成html呢?那么JAVA就无能为力了,好在有socket.io.下面来看看如何实现吧. 1.你必需知道socket.io实现上就是一个js文件,它可以在这下载.(ht

Java Nio Socket通讯

Server端: #############服务器端连接请求处理############### public class MultiplexerServer implements Runnable { /**多路复用器,SocketChannel注册到Selector.Selector轮询监听Channel网络事件*/ private Selector selector; private ServerSocketChannel serverSocketChannel; private boole

JAVA之Socket通讯

Server.java: Client.java Server console:(先启动服务器,再启动客户端)  服务器读取了客户端发来的hello server: Client console:客户端读取了服务器发来的收到r: 原文地址:https://www.cnblogs.com/lelexiong/p/8733612.html

java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证

一.        SSL概述 SSL协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传输过程中是否被篡改和伪造,从而为敏感数据的传输提供了一种安全保障手段. SSL协议提供的服务主要有: 1)认证用户和服务器,确保数据发送到正确的客户机和服务器 认证用户和服务器的合法性,使它们能够确信数据将被发送到正确的客户机和服务器上.客户机和服务器都有各自的识别号,这些识别号由公开密钥进行编号,

多线程Java Socket编程示例(转)

这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package sterning; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import

Java Socket通讯---网络基础

java socket 通讯 参考慕课网:http://www.imooc.com/learn/161 一.网络基础知识 1.1 通讯示意图 1.2 TCP/IP协议 TCP/IP是世界上应用最为广泛的协议 是以TCP/IP为基础的不同层次上多个协议的集合 也称TCP/IP协议簇 或 TCP/IP协议栈 TCP:Transmission Control Protocol, 传输控制协议 IP:Internet Protocol,互联网协议 1.3 TCP/IP模型 1.4 IP地址 为实现网络中

Java基于Socket文件传输示例(转)

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream;

多线程Java Socket编程示例

package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class Hand

Java基于Socket文件传输示例

最近需要进行网络传输大文件,于是对基于socket的文件传输作了一个初步的了解.在一位网友提供的程序基础上,俺进行了一些加工,采用了缓冲输入/输出流来包装输出流,再采用数据输入/输出输出流进行包装,加快传输的速度.废话少说,先来看服务器端的程序. 1.服务器端 package localSocket; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStrea