java - HttpsURLConnection 的 SSLSocket

标签 java httpsurlconnection

我有一个 JEditorPane,它通过 SSL/TLS 加载网站。我的目标是(通过反射)获取 SSL 连接的特定信息,例如 SSL 握手的完成消息。我从 JEditorPane 获得的唯一信息是 URL 以及 HttpsURLConnection

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

最佳答案

没有直接的方法来获取它。但您可以控制 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/

相关文章:

java - 用于数字检索的节省空间的概率数据结构

java - 带客户端身份验证的 HTTPS 在 Android 上不起作用

android - 将 cookie 存储在 sharedpreferences 中

java - 如何在 JAVA 中加速 tls 协商?

Java HttpsURLConnection 和 TLS 1.2

java - IOException : javax.net.ssl.SSLHandshakeException : SSL handshake aborted: ssl=0xafdb8e00: I/O error during system call, 连接由对等方重置

java - 所有请求似乎都来自使用 Azure 上的 Tomcat 的 127.0.0.1

java - SubGit Java 堆空间

java - 使用 MouseAdapter 移动光标时获取光标位置

java - 克隆新对象以传递给 ArrayList?