Java网络编程 Ch10 secure socket Layer

//定义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()

客户端模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值