(из комментариев, немного расширен)
Если SSLSocket.getSession()
вызывается до того, как рукопожатие выполнено, он пытается это сделать, но если рукопожатие не удается getSession()
глотает исключение и просто возвращает 'объект nullSession, который не имеет данных, которые имел бы реальный объект сеанса.Либо (1) установите sysprop javax.net.debug=ssl
(при запуске, обычно в командной строке с -D
) и посмотрите, что в нем записано, чтобы увидеть, что не так с вашим рукопожатием, либо (2) явно вызовите ((SSLSocket)s).startHandshake()
(который, несмотря наимя на самом деле запускает рукопожатие до завершения, успешно или нет) и посмотреть, что оно бросает.
В частности, если вы используете файл хранилища ключей, созданный с помощью первого показанного кода, который содержит только сертификат (trustedCertEntry), а не privateKeyEntry (как с privatekey, так и с сертификатом / цепочкой), как это необходимо и требуется для SSL /TLS-сервер для использования любого из стандартных и включенных по умолчанию пакетов;эта ошибка обычно проявляется в некотором замешательстве как сбой при рукопожатии, когда «нет общего шифра [набора]] или« нет совпадения шифра [набора] ».
Эта вторая часть (сервер SSL / TLS без приватного ключа не работает) много раз спрашивалась и отвечала, но я не помню ни одной ошибки, которая также включает часть 'getSession маскирует ошибку'.