2013-06-15 3 views
3

나는 SSL/TLS를 통해 웹 사이트를로드하는 JEditorPane을 가지고 있습니다. 제 목표는 SSL 핸드 셰이크의 완료 메시지처럼 SSL 연결의 특정 정보를 얻는 것입니다. 내가 JEditorPane에서 얻을 수있는 유일한 것은 URL이며 따라서 HttpsURLConnection입니다.HttpsURLConnection의 SSLSocket

그러나 HttpsURLConnectionSSLSocket은 어떻게 받습니까? 어떤 아이디어?

답변

0

직접적인 방법은 없습니다. 그러나 HttpsURLConnection에서 사용하는 SSL 소켓을 제어 할 수 있습니다. httppsURLConnection.setSSLSocketFactory()에서 소켓 팩토리를 설정할 수 있습니다.

자신 만의 장식 된 sslsocket을 생성하고 반환하는 사용자 정의 소켓 팩토리를 만들 수 있습니다. 이 소켓은 HttpsURLConnection에서 사용하는 소켓입니다.

연결이 설정되기 전에이 작업을 수행해야합니다.

SSLSocketFactory sslSktFactory = SSLContext.getInstance("TLS").getSocketFactory(); 

httpsUrlConnection.setSSLSocketFactory(new CustomSSLSocketFactory(sslSktFactory)); 

샘플 사용자 정의 SSL 소켓 팩토리는

class CustomSSLSocketFactory extends SSLSocketFactory { 
    SSLSocketFactory factory = null; 
    CustomSSLSocketFactory(SSLSocketFactory factory) { 
     this.factory = factory; 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, 
      boolean autoClose) throws IOException { 
     Socket skt = factory.createSocket(s, host, port, autoClose); 
     return customizeSSLSocket(skt); 
    } 

    @Override 
    public String[] getDefaultCipherSuites() { 
     return factory.getDefaultCipherSuites(); 
    } 

    @Override 
    public String[] getSupportedCipherSuites() { 
     return factory.getSupportedCipherSuites(); 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException, 
      UnknownHostException { 
     Socket skt = factory.createSocket(host, port); 
     return customizeSSLSocket(skt); 
    } 

    @Override 
    public Socket createSocket(InetAddress host, int port) throws IOException { 
     Socket skt = factory.createSocket(host, port); 
     return customizeSSLSocket(skt); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, 
      int localPort) throws IOException, UnknownHostException { 
     Socket skt = factory.createSocket(host, port, localHost, localPort); 
     return customizeSSLSocket(skt); 
    } 

    @Override 
    public Socket createSocket(InetAddress address, int port, 
      InetAddress localAddress, int localPort) throws IOException { 
     Socket skt = factory.createSocket(address, port, localAddress, localPort); 
     return customizeSSLSocket(skt); 
    } 

    private Socket customizeSSLSocket(Socket skt) throws SocketException { 
     ((SSLSocket)skt).addHandshakeCompletedListener(
       new HandshakeCompletedListener() { 
        public void handshakeCompleted(
          HandshakeCompletedEvent event) { 
         System.out.println("Handshake finished!"); 
         System.out.println(
           "\t CipherSuite:" + event.getCipherSuite()); 
         System.out.println(
           "\t SessionId " + event.getSession()); 
         System.out.println(
           "\t PeerHost " + event.getSession().getPeerHost()); 
         System.out.println(
           "\t PeerHost " + event.getSession().getProtocol()); 

        } 
       } 
       );  
     return skt; 
    } 
이하