Может ли getPeerCertificates () блокироваться бесконечно или надолго? - PullRequest
2 голосов
/ 11 июля 2020

Рассмотрим следующую функцию:

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;
}

1 Ответ

2 голосов
/ 11 июля 2020

но возможно ли, что код будет блокироваться надолго на getSession().getPeerCertificates()

Нет. Вызов getPeerCertificates() на SSLSession возвращает копию сертификатов, которые были представлены одноранговым узлом в подтверждении SSL. По вызову, возвращаемому вызовом connect в предыдущей строке, рукопожатие завершено.

...