Android - Apache Ftps - SSLException - PullRequest
       17

Android - Apache Ftps - SSLException

1 голос
/ 30 апреля 2019

Я пытаюсь использовать Apache FTPSClient для загрузки файла на локальный FTP-сервер.

Я сейчас устанавливаю trustManager = TrustManagerUtils.getAcceptAllTrustManager(), так как пока не хочу иметь дело с неподписанным сертификатом на сервере. После подключения я пытаюсь загрузить файл с storeFile(...).

Вот код:

FTPSClient().apply {
        trustManager = TrustManagerUtils.getAcceptAllTrustManager()

        connect(ftpHostName, ftpPort)

        if (login(ftpUser, ftpPassword)) {
            setFileType(FTP.BINARY_FILE_TYPE)
            enterLocalPassiveMode()
            execPBSZ(0)
            execPROT("P")

            bufferSize = 1024

            var success = false
            resources.openRawResource(updateContainer.resource).use { input ->
                success = storeFile(updateContainer.remoteFileName, input)
                // todo javax.net.ssl.SSLException: Write error: ssl=0x737c1ef588: I/O error during system call, Broken pipe
            }

            logout()
            disconnect()

            if(success) {
                // ...
            }
        } else {
            // ...
        }
}

Вот журнал истории:

V: FTPS/receive/220 you're at home
V: FTPS/sent/AUTH TLS
V: FTPS/receive/234 AUTH TLS successful
V: FTPS/sent/USER randomuser
V: FTPS/receive/331 Password required for randomuser
V: FTPS/sent/PASS randompassword
V: FTPS/receive/230 Welcome !
V: FTPS/sent/TYPE I
V: FTPS/receive/200 Type set to I
V: FTPS/sent/PBSZ 0
V: FTPS/receive/200 PBSZ 0 successful
V: FTPS/sent/PROT P
V: FTPS/receive/200 Protection set to Private
V: FTPS/sent/PASV
V: FTPS/receive/227 Entering Passive Mode (...).
V: FTPS/sent/STOR xyz.mender
V: FTPS/receive/150 Opening BINARY mode data connection for xyz.mender

Таким образом, соединение работает, но как только я пытаюсь загрузить файл, я получаю исключение:

E: org.apache.commons.net.io.CopyStreamException: IOException caught while copying.
        at org.apache.commons.net.io.Util.copyStream(Util.java:136)

что вызвано:

 Caused by: javax.net.ssl.SSLException: Write error: ssl=0x73d1256688: I/O error during system call, Broken pipe
    at com.android.org.conscrypt.NativeCrypto.SSL_write(Native Method)
    at com.android.org.conscrypt.NativeSsl.write(NativeSsl.java:425)
    at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLOutputStream.write(ConscryptFileDescriptorSocket.java:626)

Сервер отключает повторное использование сеанса (TLSOptions NoSessionReuseRequired), поэтому проблема не в этом.

Заранее спасибо за помощь!

Редактировать: при попытке загрузить файл через FileZilla, он работает. Однако я должен явно доверять неизвестному сертификату сервера. Может быть, trustManager = TrustManagerUtils.getAcceptAllTrustManager() не делает то, что я думаю, что делает? И если да, может ли кто-нибудь предоставить мне пример того, как создать SSLContext, чтобы доверять сертификату сервера (у меня есть доступ к файлу .crt сервера).

...