java - getPeerCertificates() 可以无限期或长时间阻塞吗?

标签 java ssl networking network-programming

考虑以下函数:

public Certificate[] getCertificates(String ip) throws Exception {
    try (SSLSocket sslSocket = (SSLSocket) sslContext.getSocketFactory().createSocket()) {
        SocketAddress socketAddress = new InetSocketAddress(ip, port);
        sslSocket.connect(socketAddress, 10000);
        Certificate[] certificates = sslSocket.getSession().getPeerCertificates();
        return certificates;
    }
}

此代码可以在哪些条件下挂起?基本上,我为连接阶段设置了 10 秒超时,但是代码是否有可能在 getSession().getPeerCertificates() 部分阻塞很长时间?

请考虑以下事实:IP 和端口可以是任意的(甚至不是 SSL,有时甚至不可路由)

此外,这就是我启动 sslContext

的方式
private SSLContext getSslContext() throws Exception {

    SSLContext sslCtx;
    sslCtx = SSLContext.getInstance("TLSv1.2");

    sslCtx.init(null, new TrustManager[]{new X509TrustManager() {

        private X509Certificate[] accepted;

        @Override
        public void checkClientTrusted(X509Certificate[] xcs, String string) {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] xcs, String string) {
            accepted = xcs;
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return accepted;
        }
    }}, null);

    return sslCtx;
}

最佳答案

but is it possible that the code will block for a long time on the getSession().getPeerCertificates()

没有。对 SSLSessiongetPeerCertificates() 调用会返回对等方在 SSL 握手中提供的证书的副本。通过上一行的 connect 调用返回的调用,握手已完成。

关于java - getPeerCertificates() 可以无限期或长时间阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62849700/

相关文章:

networking - 网络单元定义 : Fragment, 段、数据包、帧、数据报

java - Java 中的通用 QoS 消息批处理和压缩

java - 如何在 Java 中复制或克隆链表实现队列?

java - JAVA 中带有 JSON 字符串的 HTTP POST 请求不起作用

ssl - RabbitMQ:尝试使用 SSL 证书时出现握手错误

ios - 使用 Swift 3 和 Alamofire 4 获取客户端证书以进行相互身份验证

java - Android 查找 SDCard 上的文件

java - 想要播放应用程序的背景音乐时,计算机找不到 'AudioStream'

ssl - TLS 1.2 SHA384 : What should be the length of verify_data in "Finished" message?

java服务器处理多个tcp连接