好久没用过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代码:
[js]
view plain
copy
print
?
1. import
2. import
3. import
4. import
5.
6. import
7. import
8. import
9. import
10.
11.
12. public class
13.
14. /**
15. * name:KeystoreTest
16. * author:suju
17. */
18. public static void main(String[] args) throws
19. "c:/.keystore";
20. "JKS");
21. //keystore的类型,默认是jks
22. new FileInputStream(key),"123456".toCharArray());
23. //创建jkd密钥访问库 123456是keystore密码。
24. "SunX509");
25. "asdfgh".toCharArray());
26. //asdfgh是key密码。
27. //创建管理jks密钥库的x509密钥管理器,用来管理密钥,需要key的密码
28. "SSLv3");
29. // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
30. null,null);
31. //第二个参数TrustManager[] 是认证管理器,在需要双向认证时使用,
32. //构造ssl环境
33.
34. SSLServerSocketFactory sslfactory=sslc.getServerSocketFactory();
35. SSLServerSocket serversocket=(SSLServerSocket) sslfactory.createServerSocket(9999);
36. //创建serversocket,监听,并传输数据来验证授权
37. for(int
38. {
39. final
40. new
41. public void
42. {
43. try{
44. InputStream is=socket.getInputStream();
45. OutputStream os=socket.getOutputStream();
46.
47. byte[] buf=new byte[1024];
48. int
49. new
50. "ssl test".getBytes());
51. os.close();
52. is.close();
53. catch(Exception e)
54. // }
55. }
56. }.start();
57. }
58. serversocket.close();
59. }
60. }
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代码:
[js]
view plain
copy
print
?
1. import
2. import
3. import
4. import
5.
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13.
14. public class
15. /**
16. * name:KeystoreTestClient
17. * author:suju
18. */
19. public static void main(String[] args) throws
20. "c:/client";
21. "JKS"); //创建一个keystore来管理密钥库
22. new FileInputStream(key),"123456".toCharArray());
23. //创建jkd密钥访问库
24. "SunX509");
25. //验证数据,可以不传入key密码
26. //创建TrustManagerFactory,管理授权证书
27. "SSLv3");
28. // 构造SSL环境,指定SSL版本为3.0,也可以使用TLSv1,但是SSLv3更加常用。
29. null,tmf.getTrustManagers(),null);
30. //KeyManager[] 第一个参数是授权的密钥管理器,用来授权验证。第二个是被授权的证书管理器,
31. //用来验证服务器端的证书。只验证服务器数据,第一个管理器可以为null
32. //构造ssl环境
33.
34. SSLSocketFactory sslfactory=sslc.getSocketFactory();
35. "127.0.0.1",9999);
36. //创建serversocket通过传输数据来验证授权
37.
38. InputStream is=socket.getInputStream();
39. OutputStream os=socket.getOutputStream();
40. "client".getBytes());
41. byte[] buf=new byte[1024];
42. int
43. new
44. os.close();
45. is.close();
46. }
47. }
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帮助命令