4

JEditorPaneSSL/TLS 経由で Web サイトをロードする があります。私の目標は、SSL ハンドシェイクの完了メッセージのような SSL 接続の特定の情報を (反映して) 取得することです。私が得る唯一のものJEditorPaneURL、したがって、HttpsURLConnectionです。

しかし、どうすれば の を取得できSSLSocketますHttpsURLConnectionか? 何か案は?

4

1 に答える 1

1

直接入手する方法はありません。ただし、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;
    }
于 2016-08-12T16:03:56.673 に答える