`
sariel
  • 浏览: 52841 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TLS/SSL Socket 实现

    博客分类:
  • Java
阅读更多
服务器端代码:
import java.net.*;
import javax.net.ssl.*;
import java.io.*;
import java.security.*;

public class SSLServer {

	private static int port = 50003;
	private static SSLServerSocket server;

	public static void initSSLServerSocket() {
		try {
			/** 要使用的证书名 **/
			String cert = "\\key.cert";
			/** 要使用的证书密码 **/
			char certPass[] = "123456".toCharArray();
			/** 证书别称所使用的主要密码 **/
			char certAliaMainPass[] = "123456".toCharArray();
			/** 创建JKS密钥库 **/
			KeyStore keyStore = KeyStore.getInstance("JKS");
			keyStore.load(new FileInputStream(cert), certPass);
			/** 创建管理JKS密钥库的X.509密钥管理器 **/
			KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
			keyManagerFactory.init(keyStore, certAliaMainPass);
			SSLContext sslContext = SSLContext.getInstance("TLSV1");
			/** 想使用SSL时,更改成如下,注释部分 **/
			//SSLContext sslContext = SSLContext.getInstance("SSLV3");
			sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
			SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
			server = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void main(String args[]) {
		try {
			initSSLServerSocket();
			System.out.println("服务器在端口 [" + port + "] 等待连接...");
			while (true) {
				SSLSocket socket = (SSLSocket) server.accept();
				new CreateThread(socket);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class CreateThread extends Thread {
	private static BufferedReader in;
	private static PrintWriter out;
	private static Socket s;

	public CreateThread(Socket socket) {
		try {
			s = socket;
			in = new BufferedReader(new InputStreamReader(s.getInputStream(), "GB2312"));
			out = new PrintWriter(s.getOutputStream(), true);
			start();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void run() {
		try {
			String msg = in.readLine();
			System.out.println("接收到: " + msg);
			out.write("服务器接收到的信息是: " + msg);
			out.flush();
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

客户端代码:
import java.net.*;
import javax.net.ssl.*;
import java.io.*;

public class SSLClient {

	static int port = 50003;

	public static void main(String args[]) {
		try {
			SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
			Socket s = factory.createSocket("192.168.12.41", port);
			BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(), "GB2312"));
			PrintWriter out = new PrintWriter(s.getOutputStream(), true);
			out.println("证书启用成功!");
			System.out.println(in.readLine());
			out.close();
			s.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

服务器启动:java SSLServer
            key.cert 文件需要和 SSLServer.class 同一目录下

客户端运行:java -Djavax.net.ssl.trustStore=key.cert SSLClient

key文件生成:keytool -genkey -keystore Key.cert -keyalg rsa –alias tempkey
或者: keytool -genkey -alias tempkey -keysize 512 -validity 3650 -keyalg RSA -dname "CN=sariel.iteye.com, OU=sariel CA,  O=sariel Inc, L=Stockholm, S=Stockholm, C=SE" -keypass 123456 -storepass 123456 -keystore key.cert
  • key.rar (934 Bytes)
  • 下载次数: 210
分享到:
评论
1 楼 wangleifire 2011-07-26  
请问为什么我总是报Client:unable to find valid certification path to requested target
Server:Received fatal alert: certificate_unknown
请加QQ346685272 谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics