Получить версию SSL, используемую в HttpsURLConnection - Java

Я разрабатываю Java-агент для мониторинга http-коммуникаций, происходящих на моем сервере приложений. Мне нравится знать версию SSL (SSLv3, TLS и т. Д.), Используемую в исходящих соединениях Https. Есть ли способ получить версию SSL любым способом?

1 ответ

Я использовал это решение, может быть, оно может помочь вам:

Сначала вам нужно расширение класса SSLSocketFactory прикрепить HandshakeCompletedListener к сокетам, созданным SSLSocketFactory: (вдохновлено Как переопределить список шифров, отправленный на сервер Android при использовании HttpsURLConnection?)

public class SecureSSLSocketFactory extends SSLSocketFactory {
private final SSLSocketFactory delegate;
private HandshakeCompletedListener handshakeListener;

public SecureSSLSocketFactory(
        SSLSocketFactory delegate, HandshakeCompletedListener handshakeListener) {
    this.delegate = delegate;
    this.handshakeListener = handshakeListener;
}

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) 
    throws IOException {
    SSLSocket socket = (SSLSocket) this.delegate.createSocket(s, host, port, autoClose);

    if (null != this.handshakeListener) {
        socket.addHandshakeCompletedListener(this.handshakeListener);
    }

    return socket;
}
// and so on for all the other createSocket methods of SSLSocketFactory.

@Override
public String[] getDefaultCipherSuites() {
    // TODO: or your own preferences
    return this.delegate.getDefaultCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
    // TODO: or your own preferences
    return this.delegate.getSupportedCipherSuites();
}

Тогда вам нужна реализация HandshakeCompletedListener интерфейс. Вы должны реализовать handshakeCompleted метод:

public class MyHandshakeCompletedListener implements HandshakeCompletedListener {
@Override
public void handshakeCompleted(HandshakeCompletedEvent event) {
    SSLSession session = event.getSession();
    String protocol = session.getProtocol();
    String cipherSuite = session.getCipherSuite();
    String peerName = null;

    try {
        peerName = session.getPeerPrincipal().getName();
    } catch (SSLPeerUnverifiedException e) {
    }
}

В handshakeCompleted вы можете получить версию протокола (возможно, TLSv1.2), а также информацию о наборе шифров и т. д., которая также доступна через HttpsConnection, Вы можете установить собственную фабрику сокетов SSL через conn.setSSLSocketFactory перед подключением:

private void setupAndConnect() {
URL url = new URL("https://host.dom/xyz");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(/*keyManagers*/null, /*trustManagers*/null, /*new SecureRandom()*/null);    // simple here

conn.setSSLSocketFactory(new SecureSSLSocketFactory(sslContext.getSocketFactory(), new MyHandshakeCompletedListener()));

// conn.set... /* set other parameters */
conn.connect();
Другие вопросы по тегам