JEditorPane
SSL/TLS 経由で Web サイトをロードする があります。私の目標は、SSL ハンドシェイクの完了メッセージのような SSL 接続の特定の情報を (反映して) 取得することです。私が得る唯一のものJEditorPane
はURL
、したがって、HttpsURLConnection
です。
しかし、どうすれば の を取得できSSLSocket
ますHttpsURLConnection
か? 何か案は?
JEditorPane
SSL/TLS 経由で Web サイトをロードする があります。私の目標は、SSL ハンドシェイクの完了メッセージのような SSL 接続の特定の情報を (反映して) 取得することです。私が得る唯一のものJEditorPane
はURL
、したがって、HttpsURLConnection
です。
しかし、どうすれば の を取得できSSLSocket
ますHttpsURLConnection
か? 何か案は?
直接入手する方法はありません。ただし、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;
}