Дублирование: есть несколько похожих вопросов (Как я могу получить доступ к соединению 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
кажется неверным: я нашел документацию для обоих, которые предоставляют сертификаты для явного использования клиентами (я полагаю, самозаверяющие, это не указано). Некоторые примеры, опускающие это, ввели меня в заблуждение.
- ssl://iot.eclipse.org:8883 : iot.eclipse.org.crt как указано в http://iot.eclipse.org/getting-started
- ssl://test.mosquitto.org:8883 : mosquitto.org.crt как указано на http://test.mosquitto.org/
Загружаю сертификаты в кастомный TrustManager
, все работает. Тайна раскрыта в этом вопросе. Наш собственный брокер с сертификатами CA еще не готов к тестированию.