java中 SSL认证和keystore使用

 
好久没用过SSL认证了,东西久不用,就有点生疏。博客就是有这个好处,可以做备忘录。
java中是通过SSL认证,使用的是SSLSocket,通过SSLSocketFactory可以获得SSLSocket实例对象。通常SSLSocketFactory需要一个SSLContext环境对象来构建,
构建一个SSLContext 环境:
SSLContext sslc=SSLContext.getInstance("SSLv3");
 // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
sslc.init(KeyManager[],TrustManager[]null);
//KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。TrustManager[]第二个是被授权的证书管理器,用来验证服务器端的证书。第三个参数是一个随机数值,可以填写null。如果只是服务器传输数据给客户端来验证,就传入第一个参数就可以,客户端构建环境就传入第二个参数。
双向认证的话,就同时使用两个管理器。
服务端:

[代码]java代码:

import java.io.FileInputStream;
import java.io.*;
import java.net.Socket;
import java.security.KeyStore;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;


public class KeystoreTest {

	/**
	 * name:KeystoreTest
	 * author:suju
	 */
	public static void main(String[] args) throws Exception{
		String key="c:/.keystore";
		KeyStore keystore=KeyStore.getInstance("JKS");
		//keystore的类型,默认是jks
		keystore.load(new FileInputStream(key),"123456".toCharArray());
		//创建jkd密钥访问库	123456是keystore密码。
		KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
		kmf.init(keystore,"asdfgh".toCharArray());
		//asdfgh是key密码。
		//创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码
		SSLContext sslc=SSLContext.getInstance("SSLv3");
		// 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
		sslc.init(kmf.getKeyManagers(),null,null);
		//第二个参数TrustManager[] 是认证管理器,在需要双向认证时使用,
		//构造ssl环境
		
		SSLServerSocketFactory sslfactory=sslc.getServerSocketFactory();
		 SSLServerSocket serversocket=(SSLServerSocket) sslfactory.createServerSocket(9999);
		//创建serversocket,监听,并传输数据来验证授权
		 for(int i=0;i<15;i++)
		 { 
			 final Socket socket=serversocket.accept();
			 new Thread(){
				 public void run()
				 {
					 try{
						 InputStream is=socket.getInputStream();
						 OutputStream os=socket.getOutputStream();
						 
						 byte[] buf=new byte[1024];
						 int len=is.read(buf);
						 System.out.println(new String(buf));
						 os.write("ssl test".getBytes());
						 os.close();
						 is.close();
					 }catch(Exception e)
					 {// }
				 }
			 }.start();
		 }
		  serversocket.close();	
	}
}

客户端:

[代码]java代码:

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class KeystoreTestClient {
	/**
	 * name:KeystoreTestClient
	 * author:suju
	 */
	public static void main(String[] args) throws Exception{
		String key="c:/client";
		KeyStore keystore=KeyStore.getInstance("JKS");	//创建一个keystore来管理密钥库
		keystore.load(new FileInputStream(key),"123456".toCharArray());
		//创建jkd密钥访问库
		TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");
		tmf.init(keystore);					//验证数据,可以不传入key密码
		//创建TrustManagerFactory,管理授权证书
		SSLContext sslc=SSLContext.getInstance("SSLv3");
		// 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
		sslc.init(null,tmf.getTrustManagers(),null);
		//KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。第二个是被授权的证书管理器,
		//用来验证服务器端的证书。只验证服务器数据,第一个管理器可以为null
		//构造ssl环境
		
		SSLSocketFactory sslfactory=sslc.getSocketFactory();
		 SSLSocket socket=(SSLSocket) sslfactory.createSocket("127.0.0.1",9999);
		//创建serversocket通过传输数据来验证授权
		 
		 InputStream is=socket.getInputStream();
		 OutputStream os=socket.getOutputStream();		 
		 os.write("client".getBytes());		 
		 byte[] buf=new byte[1024];
		 int len=is.read(buf);
		 System.out.println(new String(buf)); 
		 os.close();
		 is.close();
	}
}
使用java中自带keytool管理keystore。
**经常忘记参数,写下来记住。
默认密钥库下创建一个key     keytool -genkeypair

显示默认keystore的key详细信息  keytool -list -v


使用其他keystore来创建key,如果keystore不存在就创建一个新的。 keytool --genkeypair -keystore c:\client

导出一个key    keytool -exportcert -alias mykey -file c:\mykey.cer

导入一个key到一个keystore,  keytool -importcert -alias mykey -file c:\mykey.cer -keystore c:\client

还有很多关于key的操作,keytool提供了-help帮助命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值