好久没用过SSL认证了,东西久不用,就有点生疏。博客就是有这个好处,可以做备忘录。
java中是通过SSL认证,使用的是SSLSocket,通过SSLSocketFactory可以获得SSLSocket实例对象。通常SSLSocketFactory需要一个SSLContext环境对象来构建,
构建一个SSLContext 环境:
SSLContext sslc=SSLContext.getInstance("SSLv3");
// 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
// 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
sslc.init(KeyManager[],TrustManager[]null);
//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