Java加密解密(三)浅谈基于SSL的Socket通信
浅谈基于SSL的Socket通信
客户端认证服务器,即判断当前客户端连接的服务器是否可信
当客户使用SSL向站点服务器发送请求时,服务器向客户端发送一个证书,客户使用已安装的证书,验证服务器身份,然后检查IP地址(主机名)与客户端连接的主机是否匹配。客户生成可以用来对话的私钥(称为会话密钥),然后用服务者的公钥对它进行加密并将它发送到服务者。服务者用自己的私钥解密,然后用该信息和客户端一样的私有会话密钥。通常在这个阶段使用RSA算法。
随后,客户端和服务器端使用私有会话密钥和私钥算法(通常是RC4)进行通信。使用另一个密钥的消息认证码来确保消息的完整性。
使用JSSE实现客户与服务器端安全通信的步骤如下:
1. 建立服务器端密钥库,制作数字证书
(a) 建立服务器端密钥库
public class TestSSLSocketClient {private static String path = "e:\\keytool\\sslclient.keystore";private static char[] password = "aaaaaaa".toCharArray();/** * @param args */public static void main(String[] args) {SSLContext context = null;try {KeyStore ts = KeyStore.getInstance("JKS");ts.load(new FileInputStream(path), password);TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");tmf.init(ts);TrustManager [] tm = tmf.getTrustManagers();context = SSLContext.getInstance("SSL");context.init(null, tm, null);} catch (...... e) { //省略捕获的异常信息e.printStackTrace();} SSLSocketFactory ssf = context.getSocketFactory();try {SSLSocket ss = (SSLSocket) ssf.createSocket("localhost", 8000);System.out.println("客户端就绪。");ObjectInputStream br = new ObjectInputStream(ss.getInputStream());try {System.out.println(br.readObject());} catch (ClassNotFoundException e) {e.printStackTrace();}br.close();ss.close();System.out.println("客户端测试ok");} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}