Я пытаюсь установить SSL-соединение и получаю сообщение 400. Требуемый сертификат SSL не был отправлен< /code> ответ от сервера. Я делаю это стандартным способом, как описано, например, здесь; Я использую Java 8.
main, called close()
main, called closeInternal(true)
main, SEND TLSv1.2 ALERT: warning, description = close_notify
main, WRITE: TLSv1.2 Alert, length = 26
main, called closeSocket(true)
Это единственное, что я могу считать «ненормальным» (но сомневаюсь, что это так).
Я пробовал:
Отключение разных протоколов /включение. Например, принудительное принудительное использование TLSv1/TLSv1.1 для сокета безуспешно. Чтобы попробовать это, я включил свою фабрику SSL в другую фабрику, которая отключает/включает определенные протоколы.
Отключение SSLv2Hello - но это не меняет картину.
Установите политики Oracle, потому что раньше были уведомления о некоторых пропущенных алгоритмах, и эта установка «решила» эту проблему, но общий результат остался прежним.
Настройка System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); - отстой, но также ничего не изменилось, кроме сообщения в журнале Разрешить небезопасное повторное согласование: true ( очевидно, было «ложным»)
Использование KeyManagerFactory.getDefaultAlgorithm() в качестве алгоритма для вызова KeyManagerFactory.getInstance(). Это вызывает исключение. Ошибка получения ключа: учитывая, что последний блок не заполнен должным образом, и, насколько я понял, это из-за неправильного используемого алгоритма (прочитайте это). Мой алгоритм по умолчанию: SunX509
Добавление сертификата непосредственно на мой компьютер с помощью keytool -importcert -file /path/to/certificate -keystore keystore.jks -alias "Псевдоним" и затем использую это в своей программе через System.setProperty("javax.net.ssl.trustStore","/path/to/keystore.jks"); с установкой пароля: System.setProperty( "javax.net.ssl.trustStorePassword","mypassword"); (я установил пароль в keytool, после чего подтвердил доверенный сертификат с помощью Yes); посмотрите этот и этот посты. Никаких ошибок при этом не возникло, но проблема осталась.
Добавление сертификата в глобальное хранилище ключей (тот, который расположен в JAVA_PATH/jre/lib/security/cacerts) с помощью: keytool -import -trustcacerts -keystore cacerts -storepasschangeit -noprompt -alias Alias -file /path/to/certificate (см. это); похоже, операция импорта прошла успешно, но картина не изменилась
В отладке также есть уведомление: ssl: KeyMgr: выбор ключа: 1 (проверено: ОК) – не уверен, что это актуально, поскольку я не эксперт по SSL.
К сожалению, я не могу просмотреть журналы на стороне сервера, поэтому Полной картины не вижу.
Вопрос
Что может быть причина этой ошибки 400 и как мне двигаться дальше (отладить/попробовать что-то еще)? Будем очень признательны за любые советы.
Я пытаюсь установить SSL-соединение и получаю сообщение 400. Требуемый сертификат SSL не был отправлен< /code> ответ от сервера. Я делаю это стандартным способом, как описано, например, здесь; Я использую Java 8.
Пример моего кода:
[code] OkHttpClient client = new OkHttpClient(); KeyStore keyStoreClient = getClientKeyStore(); KeyStore keyStoreServer = getServerKeyStore(); String algorithm = ALGO_DEFAULT;//this is defined as "PKIX"
Так вот видеть отладочные сообщения - а ошибок/предупреждений/оповещений там нет, единственное, что в самом конце:
[code]main, called close() main, called closeInternal(true) main, SEND TLSv1.2 ALERT: warning, description = close_notify main, WRITE: TLSv1.2 Alert, length = 26 main, called closeSocket(true) [/code]
Это единственное, что я могу считать «ненормальным» (но сомневаюсь, что это так).
[b]Я пробовал:[/b]
[list] [*]Отключение разных протоколов /включение. Например, принудительное принудительное использование TLSv1/TLSv1.1 для сокета безуспешно. Чтобы попробовать это, я включил свою фабрику SSL в другую фабрику, которая отключает/включает определенные протоколы. [*]Отключение SSLv2Hello - но это не меняет картину. [*]Установите политики Oracle, потому что раньше были уведомления о некоторых пропущенных алгоритмах, и эта установка «решила» эту проблему, но общий результат остался прежним. [*]Настройка System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); - отстой, но также ничего не изменилось, кроме сообщения в журнале Разрешить небезопасное повторное согласование: true ( очевидно, было «ложным») [*]Использование KeyManagerFactory.getDefaultAlgorithm() в качестве алгоритма для вызова KeyManagerFactory.getInstance(). Это вызывает исключение. Ошибка получения ключа: учитывая, что последний блок не заполнен должным образом, и, насколько я понял, это из-за неправильного используемого алгоритма (прочитайте это). Мой алгоритм по умолчанию: SunX509 [*]Добавление сертификата непосредственно на мой компьютер с помощью keytool -importcert -file /path/to/certificate -keystore keystore.jks -alias "Псевдоним" и затем использую это в своей программе через System.setProperty("javax.net.ssl.trustStore","/path/to/keystore.jks"); с установкой пароля: System.setProperty( "javax.net.ssl.trustStorePassword","mypassword"); (я установил пароль в keytool, после чего подтвердил доверенный сертификат с помощью Yes); посмотрите этот и этот посты. Никаких ошибок при этом не возникло, но проблема осталась. [*]Добавление сертификата в глобальное хранилище ключей (тот, который расположен в JAVA_PATH/jre/lib/security/cacerts) с помощью: keytool -import -trustcacerts -keystore cacerts -storepasschangeit -noprompt -alias Alias -file /path/to/certificate (см. это); похоже, операция импорта прошла успешно, но картина не изменилась [/list]
В отладке также есть уведомление: ssl: KeyMgr: выбор ключа: 1 (проверено: ОК) – не уверен, что это актуально, поскольку я не эксперт по SSL.
К сожалению, я не могу просмотреть журналы на стороне сервера, поэтому Полной картины не вижу.
[b]Вопрос[/b]
Что может быть причина этой ошибки 400 и как мне двигаться дальше (отладить/попробовать что-то еще)? Будем очень признательны за любые советы.