首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpsURLConnection的SSLSocket

HttpsURLConnection的SSLSocket
EN

Stack Overflow用户
提问于 2013-06-15 18:34:51
回答 1查看 1.8K关注 0票数 4

我有一个通过SSL/TLS加载网站的JEditorPane。我的目标是(通过反射)获得SSL连接的特定信息,比如SSL握手的完成消息。我从JEditorPane得到的唯一东西是URL,因此也就是HttpsURLConnection

但是如何获得HttpsURLConnectionSSLSocket呢?有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-13 00:03:57

没有直接的方法可以得到它。但是您可以控制HttpsURLConnection使用的SSL套接字。您可以在httppsURLConnection.setSSLSocketFactory()中设置套接字工厂。

您可以创建一个自定义的套接字工厂,该工厂创建您自己的装饰过的sslsocket并返回它。这将是您的HttpsURLConnection使用的套接字。

请注意,您需要在建立连接之前执行此操作。

代码语言:javascript
复制
SSLSocketFactory sslSktFactory = SSLContext.getInstance("TLS").getSocketFactory();

httpsUrlConnection.setSSLSocketFactory(new CustomSSLSocketFactory(sslSktFactory ));

下面是自定义SSL套接字工厂的示例

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

https://stackoverflow.com/questions/17122682

复制
相关文章

相似问题

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