SSL: 400, необходимый сертификат не отправлен.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 SSL: 400, необходимый сертификат не отправлен.

Сообщение Anonymous »

Код и входные данные

Я пытаюсь установить SSL-соединение и получаю сообщение 400. Требуемый сертификат SSL не был отправлен< /code> ответ от сервера. Я делаю это стандартным способом, как описано, например, здесь; Я использую Java 8.

Пример моего кода:

Код: Выделить всё

    OkHttpClient client     = new OkHttpClient();
KeyStore keyStoreClient = getClientKeyStore();
KeyStore keyStoreServer = getServerKeyStore();
String algorithm        = ALGO_DEFAULT;//this is defined as "PKIX"

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
keyManagerFactory.init(keyStoreClient, PASSWORD_SERVER.toCharArray());

SSLContext sslContext = SSLContext.getInstance("TLS");

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(algorithm);
trustManagerFactory.init(keyStoreServer);

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

client.setSslSocketFactory(sslContext.getSocketFactory());
client.setConnectTimeout(32, TimeUnit.SECONDS); // connect timeout
client.setReadTimeout(32, TimeUnit.SECONDS);    // socket timeout

return client;
А вот код, который я использую для отправки GET-запроса:

Код: Выделить всё

public String get(String url) throws IOException
{
String callUrl  = URL_LIVE.concat(url);
Request request = new Request.Builder()
.url(callUrl)
.build();
Response response = this.client.newCall(request).execute();
return response.body().string();
}
Я включил:

Код: Выделить всё

System.setProperty("javax.net.debug", "ssl");
Так вот видеть отладочные сообщения - а ошибок/предупреждений/оповещений там нет, единственное, что в самом конце:

Код: Выделить всё

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 и как мне двигаться дальше (отладить/попробовать что-то еще)? Будем очень признательны за любые советы.

Подробнее здесь: https://stackoverflow.com/questions/362 ... e-was-sent
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»