//定义Java安全网络通信的API抽象类
javax.net.ssl;
//创建安全socket的工厂类
javax.net;
//处理SSL所需公开米密匙
java.security.cert;
com.sun.net.ssl;
创建安全客户端Socket
package Ch10;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class HTTPSClient {
public static void main(String[] args) {
if(args.length==0){
System.out.println("Usage: java HTTPSClient2 host");
return;
}
int port = 443;
String host = args[0];
//调用getDefaulst()方法得到工厂实例。
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
//创建实例
SSLSocket socket = null;
try{
//初始化
socket = (SSLSocket) factory.createSocket(host,port);
//启用所有密码组。该方法返回所有可以使用的密码组
String[] supported = socket.getSupportedCipherSuites();
//
socket.setEnabledCipherSuites(supported);
Writer out = new OutputStreamWriter(socket.getOutputStream(),"UTF-8");
//https在GET行需要完全URL
out.write("GET http://"+host+"/ HTTP/1.1\r\n");
out.write("Host: "+host+"\r\n");
out.write("\r\n");
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s;
while(!(s=in.readLine()).equals("")){
System.out.println(s);
}
String contentLength = in.readLine();
int length = Integer.MAX_VALUE;
try{
length = Integer.parseInt(contentLength.trim(),16);
}catch (NumberFormatException ex){
}
System.out.println(contentLength);
int c;
int i=0;
while((c=in.read())!=-1&&i++<length){
System.out.write(c);
}
System.out.println();
}catch (IOException ex){
System.err.println(ex);
}finally {
try{
if(socket!=null) socket.close();
}catch (IOException e){}
}
}
}
选择密码组
事件处理器
得到握手结束事件的通知,需要实现下面接口。
public interface HandShakeCompletedListener extends java.util.EvenListener{
public void handshakeCompleted(HandshakeCompletedEvent event)
}
public calss HandshakeCompletedEvent extends java.util.EventObject{
public SSLSession getSession();
//一系列获取事件有关信息的方法。
}
//特定的HandShakeCompletedListener 对象可以注册对某个SSLSocket的握手结束事件的关注。
public abstract void addHandShakeCompletedListener(HandshakeCompletedListener listener)
public abstract void removeHandShakeCompletedListener(HandshakeCompletedListener listener) throws IllegalArgumentException
会话管理
会话(Session)是性能和安全的一个折中,同属一个会话的Socket,只有第一个有产生和交换密钥带来的开销。
//控制是否建立会话。
public abstract void seEnableSessionCreation(boolean allowSessions)
//返回Socket所属会话
public abstract SSLSession getSession()
客户端模式
服务器需要向用户自证自己的身份。
//设置客户端模式
//任何指定Socket只能设置一次。第二次会抛出异常。
public abstract void setUseClientMode(boolean mode) throws IllegalArgumentException
//
public abstarct boolean getUseClientMode()
//SSLSocket,设置与它连接的客户端是否需要自行认证。
public abstract void setNeedClientAuth(boolean needsAuthentication)
创建安全服务器Socket
前面创建的是客户端SSLSocket。
public abstract class SSLServerSocket extends ServerSocket
//该类实例由抽象工厂类创建
public abstract class SSLServerSocketFactory extends ServerSocketFactory{
public static ServerSocketFactory getDefault()
}
配置SSLServerSocket
选择密码组
public abstract String[] getSupportedCipherSuites()
public abstract Striing[] getEnableCipherSuites()
public abstract void setEnableCipherSuites(String[] suites)
会话管理
public abstract void setEnableSessionCreation(boolean allowSessions)
public abstract boolean getEnableSessionCreation()