Android Paho SSL с отправленным сервером сертификатом CA, включая проверку имени хоста

Дублирование: есть несколько похожих вопросов (Как я могу получить доступ к соединению SSL через Android?, Якорь доверия для пути сертификации не найден в клиенте Android SSL Socket, Якорь доверия для пути сертификации, не найденный с использованием SSL) без подходящих ответов на мою проблему. Я пытаюсь дать конкретный контекст (например, пахо и конкретные тестовые площадки) и проблему.

Основная проблема: я использую Android Paho в качестве клиента, и все в порядке. Теперь я хочу добавить SSL-соединение. Брокер является сертифицированным лицом и отправляет свой сертификат, выданный ЦС, во время рукопожатия. (Обратите внимание, что я новичок в безопасности, я только что прочитал несколько руководств по этому вопросу.)

Большинство примеров Java и Paho, которые я могу найти, связаны с наличием локального сертификата (самостоятельно выданного или менее известного ЦС и т. д.), в то время как вместо этого мне нужно управлять сертификатами, выданными ЦС, отправленными в мое приложение сервер брокера во время рукопожатия.

Из документации Android (https://developer.android.com/training/articles/security-ssl.html), кажется, идея заключается в том, что вам просто нужно использовать SSLSocketFactory.getDefault(), поскольку сертификаты корневого ЦС для известных ЦС включены в систему. Итак, просто:

MqttConnectOptions options;

// ...

options.setSocketFactory(SSLSocketFactory.getDefault());

Но я тестировал на обоих:

  • SSL://iot.eclipse.org:8883
  • SSL://test.mosquitto.org:8883

и у меня всегда было ужасное javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Возможные причины, указанные в вышеупомянутой документации по Android и ответах на переполнение стека, по-видимому, не относятся к таким известным и используемым тестовым сайтам. Я предполагаю, что на обоих сайтах есть обновленные сертификаты, выданные известными центрами сертификации, без менее известных центров сертификации в цепочке. (Хотя я не могу найти четкого подтверждения, примеры использования в сети, кажется, подразумевают это.)

Любые указатели? Я действительно понятия не имею, куда идти отсюда (и я предполагаю, что упускаю что-то очевидное, что это не ясно указано).

Второстепенная проблема. Кроме того, документация Android предупреждает, что SSLSocket не выполняет проверку имени хоста: https://developer.android.com/training/articles/security-ssl.html.#WarningsSslSocket

И поэтому предлагает:

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("gmail.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

// Verify that the certicate hostname is for mail.google.com
// This is due to lack of SNI support in the current SSLSocket.
if (!hv.verify("mail.google.com", s)) {
    throw new SSLHandshakeException("Expected mail.google.com, "
                                    "found " + s.getPeerPrincipal());
}

Обратите внимание, что вам нужна ссылка на фактический сокет для перехода к verify() (без перегруженной альтернативы), вы не можете просто настроить SSLSocketFactory.

Paho, похоже, не предоставляет доступ к используемому сокету, а не для установки пользовательского верификатора. Вы можете установить только SSLSocketFactory.

Если я правильно понимаю, об этом сообщается об ошибке Paho: https://bugs.eclipse.org/bugs/show_bug.cgi?id=425195

Это действительно та же проблема?

Наконец, если да, то есть ли способ обойти это и на самом деле иметь Android Paho через SSL с проверкой имени хоста?

EDIT, Частичный ответ/выводы: я записываю здесь свои частичные предварительные выводы.

Мое предположение о iot.eclipse.org:8883 и test.mosquitto.org:8883 кажется неверным: я нашел документацию для обоих, которые предоставляют сертификаты для явного использования клиентами (я полагаю, самозаверяющие, это не указано). Некоторые примеры, опускающие это, ввели меня в заблуждение.

Загружаю сертификаты в кастомный TrustManager, все работает. Тайна раскрыта в этом вопросе. Наш собственный брокер с сертификатами CA еще не готов к тестированию.


person GozzoMan    schedule 04.09.2015    source источник
comment
iot.eclipse.org:8883 использует самоподписанный сертификат. test.mosquitto.org:8883 использует сертификат, выданный настраиваемым ЦС mosquitto.org, и поэтому эквивалентен самозаверяющему сертификату.   -  person Robert    schedule 09.09.2015
comment
Как вы относитесь к обновлению сертификата? Я имею в виду, что загрузка сертификатов в пользовательский TrustManager подразумевает, что вы должны поместить файл .crt в пакет.   -  person Kingslayerpy    schedule 04.05.2017