我正在尝试使用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
文件)。