FTP

2020-08-05  本文已影响0人  星_025f

一、基础环境

资料
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();
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读