首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取HttpsURLConnection中使用的SSL版本- Java

获取HttpsURLConnection中使用的SSL版本- Java
EN

Stack Overflow用户
提问于 2014-11-22 16:56:24
回答 1查看 4.1K关注 0票数 6

我正在开发一个java代理来监控我的应用服务器中发生的http通信。我想知道传出Https连接中使用的SSL版本(SSLv3、TLS等)。有没有办法获得SSL版本?

EN

回答 1

Stack Overflow用户

发布于 2015-01-04 22:19:05

我使用了这个解决方案,也许它可以帮助你:

首先,您需要一个SSLSocketFactory扩展类来将HandshakeCompletedListener附加到由SSLSocketFactory创建的套接字:(受How to override the cipherlist sent to the server by Android when using HttpsURLConnection?启发)

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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中,您可以通过HttpsConnection获取协议版本(可能是TLSv1.2),顺便说一下,还可以获取有关密码套件等的信息。您可以在连接前通过conn.setSSLSocketFactory设置自定义的SSL套接字工厂:

代码语言:javascript
复制
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();
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27075678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档