FTP

作者: 星_025f | 来源:发表于2020-08-05 11:48 被阅读0次

    一、基础环境

    资料
    1、服务端机器:192.168.0.104 FillaZilla Server端下载
    2、客户端机器:192.168.0.100 FillaZilla客户端下载

    二、FTP状态码

    1xx - 肯定的初步答复

    这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 • 110 重新启动标记答复。
    • 120 服务已就绪,在 nnn 分钟后开始。
    • 125 数据连接已打开,正在开始传输。
    • 150 文件状态正常,准备打开数据连接。

    2xx - 肯定的完成答复

    一项操作已经成功完成。客户端可以执行新命令。 • 200 命令确定。
    • 202 未执行命令,站点上的命令过多。
    • 211 系统状态,或系统帮助答复。
    • 212 目录状态。
    • 213 文件状态。
    • 214 帮助消息。
    • 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
    • 220 服务就绪,可以执行新用户的请求。
    • 221 服务关闭控制连接。如果适当,请注销。
    • 225 数据连接打开,没有进行中的传输。
    • 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
    • 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
    • 230 用户已登录,继续进行。
    • 250 请求的文件操作正确,已完成。
    • 257 已创建“PATHNAME”。

    3xx - 肯定的中间答复

    该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。 • 331 用户名正确,需要密码。
    • 332 需要登录帐户。
    • 350 请求的文件操作正在等待进一步的信息。

    4xx - 瞬态否定的完成答复

    该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。 • 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
    • 425 无法打开数据连接。
    • 426 Connection closed; transfer aborted.
    • 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
    • 451 请求的操作异常终止:正在处理本地错误。
    • 452 未执行请求的操作。系统存储空间不够。

    5xx - 永久性否定的完成答复

    该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。 • 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
    • 501 在参数中有语法错误。
    • 502 未执行命令。
    • 503 错误的命令序列。
    • 504 未执行该参数的命令。
    • 530 未登录。
    • 532 存储文件需要帐户。
    • 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
    • 551 请求的操作异常终止:未知的页面类型。
    • 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
    • 553 未执行请求的操作。不允许的文件名。

    常见的 FTP 状态代码及其原因

    • 150 - FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。
    • 226 - 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。
    • 230 - 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。
    • 331 - 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。
    • 426 - 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。
    • 530 - 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。
    • 550 - 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。

    三、android中使用类介绍

    apache FTP API

    四、FTPSClient与FTPClient

    使用FTPSClient类登录的时候会进行SSL/TLS认证。认证失败会报错
    javax.net.ssl.SSLException: 502 SSL/TLS authentication not allowed

    五、X509TrustManager信任SSL证书

    转载

    private Discovery getTrustDiscovery() throws KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException, IOException {
            // 对用户提供的标识符执行发现
            Discovery dd = new Discovery();
            
    //      //创建SSLContext对象,并使用我们指定的信任管理器初始化
    //      TrustManager[] tm = {new MyX509TrustManager ()};
    //      SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
    //      sslContext.init(null, tm, new java.security.SecureRandom());
    //
    //      //从上述SSLContext对象中得到SSLSocketFactory对象
    //      SSLSocketFactory ssf = sslContext.getSocketFactory();
    //
    //      //创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
    //      URL url=new URL(ENDPOINT);
    //      HttpsURLConnection httpsConn = (HttpsURLConnection)url.openConnection();
    //      httpsConn.setSSLSocketFactory(ssf);
            
            
            // 获取一个SSLContext实例
            SSLContext s = SSLContext.getInstance("SSL");
            X509TrustManager x509m = new X509TrustManager() {
    //          返回受信任的X509证书数组。
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
    //          该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。
    //          在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。
                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
    //          该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,
    //          因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }
            };
            s.init(null, new TrustManager[] { x509m }, new java.security.SecureRandom());
            // 打印这个SSLContext实例使用的协议
    //      System.out.println("缺省安全套接字使用的协议: " + s.getProtocol());
            // 获取SSLContext实例相关的SSLEngine
            dd.setYadisResolver(new YadisResolver(new HttpFetcherFactory(s, new X509HostnameVerifier() {
    
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    // TODO Auto-generated method stub
                    return true;
                }
    
                @Override
                public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void verify(String host, X509Certificate cert) throws SSLException {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void verify(String host, SSLSocket ssl) throws IOException {
                    // TODO Auto-generated method stub
    
                }
            })));
            return dd;
    
        }
    
    package com.jiuqi.crcc.util;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
     
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    /**
     * 
     * <p>TODO SSL忽略安全证书</p>
     *
     * <p>Copyright: 版权所有 (c) 2002 - 2008<br>
     * Company: 久其</p>
     *
     * @author lijiawen
     * @version 2019年6月30日
     */
    public class SslUtils {
        private static void trustAllHttpsCertificates() throws Exception {
            TrustManager[] trustAllCerts = new TrustManager[1];
            TrustManager tm = new miTM();
            trustAllCerts[0] = tm;
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, null);
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }
     
        static class miTM implements TrustManager,X509TrustManager {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
     
            public boolean isServerTrusted(X509Certificate[] certs) {
                return true;
            }
     
            public boolean isClientTrusted(X509Certificate[] certs) {
                return true;
            }
     
            public void checkServerTrusted(X509Certificate[] certs, String authType)
                    throws CertificateException {
                return;
            }
     
            public void checkClientTrusted(X509Certificate[] certs, String authType)
                    throws CertificateException {
                return;
            }
        }
         
        /**
         * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
         * @throws Exception
         */
        public static void ignoreSsl() throws Exception{
            HostnameVerifier hv = new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            };
            trustAllHttpsCertificates();
            HttpsURLConnection.setDefaultHostnameVerifier(hv);
        }
    }
    
    

    六、加密

    //是否使用加密
        public void isUseAuth(FTPSClient ftpClient,Context context,boolean isUse){
            if (!isUse){
                return;
            }
            try {
                final String KEY_STORE_TYPE_BKS = "bks";
                InputStream inputStream = context.getResources().getAssets().open("server.bks");
                KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS);
                trustStore.load(inputStream, "123456".toCharArray());
                TrustManagerFactory trustManagerFactory =
                        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());//获取默认的信任工程
                trustManagerFactory.init(trustStore);
                ftpClient.setAuthValue("TLS");//设置TLS模式
                ftpClient.setTrustManager(trustManagerFactory.getTrustManagers()[0]);//设置客户端信任服务器证书
                //
                ftpClient.setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    

    相关文章

      网友评论

          本文标题:FTP

          本文链接:https://www.haomeiwen.com/subject/yeunrktx.html