我有一个 JEditorPane
,它通过 SSL/TLS 加载网站。我的目标是(通过反射)获取 SSL 连接的特定信息,例如 SSL 握手的完成消息。我从 JEditorPane
获得的唯一信息是 URL
以及 HttpsURLConnection
。
但是如何获取 HttpsURLConnection
的 SSLSocket
?有什么想法吗?
最佳答案
没有直接的方法来获取它。但您可以控制 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;
}
关于java - HttpsURLConnection 的 SSLSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17122682/