Я работаю над Java-альтернативой libimobiledevice (не обернута или не привязана к родным библиотекам).
Я решил, что имеет смысл использовать Netty (v4.1.12) в качестве уровня связи, из-за природы нескольких уровней протоколов, связанных с взаимодействием со службами на устройстве, которые Netty может легко обработать с использованием конфигураций конвейера.
После реализации нескольких простых запросов от Usbmuxи Lockdown, я пытаюсь выполнить TLS-квитирование для запроса определенных сервисов на устройстве.
Сначала я попробовал простой подход - добавление SslHandler
к конвейеру:
SslContext context = SslContextBuilder.forClient().build();
channel.pipeline().addFirst(context.newHandler(channel.alloc()));
Но кажется, что сертификат, отправленный с устройства, недействителен, в глазах анализатора сертификатов JDK x509:
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLProtocolException: Empty issuer DN not allowed in X509Certificates
...
Caused by: java.security.cert.CertificateParsingException: Empty issuer DN not allowed in X509Certificates
Следующее, что я пробовал, было использование bouncycastle в качестве sslобработчик.
bouncycastle
успешно проанализировал сертификат, но потерпел неудачу во время рукопожатия с другой ошибкой:
Caused by: org.bouncycastle.crypto.tls.TlsFatalAlert: illegal_parameter(47)
at org.bouncycastle.crypto.tls.TlsClientProtocol.receiveServerHelloMessage(Unknown Source)
at org.bouncycastle.crypto.tls.TlsClientProtocol.handleHandshakeMessage(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocol.processHandshakeQueue(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocol.processRecord(Unknown Source)
at org.bouncycastle.crypto.tls.RecordStream.readRecord(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocol.safeReadRecord(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocol.blockForHandshake(Unknown Source)
at org.bouncycastle.crypto.tls.TlsClientProtocol.connect(Unknown Source)
Я попытался отладитьв bouncycastle
и понять, что было недопустимым параметром, и мне кажется, что существует несоответствие в версии протокола, запрошенной устройством (TLSv1.0), и версии, запрошенной клиентом (TLSv1.2).
Я бы вставил пример рабочего кода здесь, но для перехода к части сеанса SSL требуется довольно большой набор инструментов и библиотек синтаксического анализа.
Я попытаюсь создать образец git
репо для этой цели (возможно,даже сделать весь проект открытым исходным кодом позже), но я надеялся, что кто-то покажет мне правильное направление.
Не стесняйтесь просить другие материалы, такие как шестнадцатеричный дамп рукопожатия илисертификаты включены.