Android-Apache Ftps-SSLException

时间:2019-04-30 16:31:54

标签: android apache ssl ftp ftps

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

0 个答案:

没有答案