Я пытаюсь использовать 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
сервера).