关于Ftp使用SSL流程认证

本文章使用的是C#,ftp服务器为FileZilla

注:如果不是使用的Socket可以使用FtpWebRequst类,说实话,该类比较简单,但现在说的是SOCKET,网上关于这方面的实在太少了

流程(不会画图,就笔述)

大致流程:

一.ssl的认证

1.连接到指定的ftp服务器(当前还未登陆)

2.发送"AUTH SSL"或"AUTH TLS"命令,返回234则成功

3.使用刚才连接的socket创建SSLSTream对象

  创建对象示例如下

 Socket mClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint mEPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 21);
mClientSocket.Connect(mEPoint);
//发送ssl命令
SendCommand("AUTH SSL");
NetworkStream network = new NetworkStream(mClientSocket);
SslStream sslStream = new SslStream(network, true, (o,i,s,j)=>true, null);
        //ssl验证
sslStream.AuthenticateAsClient("certName", null, System.Security.Authentication.SslProtocols.Ssl3 | System.Security.Authentication.SslProtocols.Tls, true);

4.成功验证后发送USER,PASS等命令(此时发送命令以及接收返回值都应当使用第三步创建的"sslStream"对象,所以需要有一个全局变量来保存该对象)

5.发送"PBSZ 0"命令,发送"PROT P"命令,登陆完成

6.以读取目录中文件为例

  6.1 在获取到端口并创建了DataSocket后,发送"LIST"命令之后,应当以DataSocket创建一个SslStream对象出来,并且进行ssl验证

  6.2 使用第3步的的SslStream对象获取一下返回值(否则后面获取文件列表会有问题)

  6.3 在6.2完成后使用6.1的SslStream对象获取返回值,即是当前目录的所有文件/目录列表

注意:

1.socket ssl认证需要两个sslStream对象,一个是连接的sslStream对象,该对象在创建并验证成功后主要用来向ftp服务器发送命令,在未创建数据的sslStream对象时获取服务器返回信息也使用该对象

2.另一个为数据对象,当创建了一个传输端口的Socket并创建其sslStream对象并验证后,后续的向ftp发送命令,以及获取返回值均使用的该对象

3.关于如何使用传输socket的sslstream来获取返回值

这一步也是困扰我很久的,因为sslStream没有方法可以知道当前流中还剩下多少数据,使用ReadByte方法会阻塞线程

所以我把传输的DataSocket给保存到全局变量中,使用DataSocket可以知道剩下的数据量

示例方法如下:

/// <summary>
/// 获取服务器返回信息
/// </summary>
/// <param name="byteSize">缓冲区大小</param>
/// <returns></returns>
public List<byte> Receive(int byteSize)
{
byte[] buffer = new byte[byteSize];
string result = string.Empty;
List<byte> list = new List<byte>();
do
{
//使用传输的sslStream来获取返回信息
int byts = DataSSLStream.Read(buffer, 0, buffer.Length);
list.AddRange(buffer.Take(byts)); //查看当前的传输socket中是否还有数据
if (DataSocket.Available == 0)
{
break;
} } while (true);
return list;
}

  

==============后面代码有时间再上

FTP使用Socket SSL流程认证(一)的更多相关文章

  1. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...

  2. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  3. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  4. JAVA中SSL证书认证通讯

    JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...

  5. Java实现 SSL双向认证

    我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法.这个就是所谓的SSL单向认证. 但是实际中,我们有可能还会验证客户端是否符合要求,也就 ...

  6. C++ windows客户端支持SSL双向认证

    C++ windows客户端支持SSL双向认证,服务端是JAVA开发的,使用的证书是jks格式的.C++并不支持JKS格式的证书,所以要用openssl进行转换下. 1. 需要先把jks转成.p12文 ...

  7. 什么是SSL双向认证,与单向认证证书有什么区别?

    SSL/TLS证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是, ...

  8. tomcat配置SSL双向认证

    一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...

  9. sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm

    sendEmail发送邮件是出现以下报错: *******************************************************************  Using the ...

随机推荐

  1. PHP功能代码片段

    1.连接MYSQL数据库代码  <?php  $connec=mysql_connect("localhost","root","root&qu ...

  2. DRF视图的使用及源码流程分析

    django rest framework中对于APIView.GenericAPIView.ModelViewSet.mixins扩展类的分析. APIView 示例 根据实际程序来分析: urls ...

  3. 关于django的坑(一)

    关于django orm 的坑: 关于设置数据库表自动更新 django的orm关于更新数据库的方法有update和save两种方法.想要表中自动更新需要一下几个条件: 使用 DateTimeFiel ...

  4. [leetcode]203. Remove Linked List Elements链表中删除节点

    这道题很基础也很重要 重点就是设置超前节点 public ListNode removeElements(ListNode head, int val) { //超前节点 ListNode pre = ...

  5. request.getContextPath()返回值问题

    转自:http://blog.sina.com.cn/s/blog_6cbe0cff0101j6jl.html request.getContextPath()是在开发Web项目时,经常用到的方法,其 ...

  6. Centos7 编译安装PHP7.2

    yum install wget 在 /usr/local/src 目录下载php源码包 wget http://cn2.php.net/distributions/php-7.2.4.tar.gz ...

  7. express安装问题

    步骤1 npm install -g express(全局安装express) (安装node就不必说了) 步骤2 npm install -g express-generator(安装命令工具) 完 ...

  8. 20210105 - python自动化办公简介

    新的一年开始了, 计划每周至少更新三篇博客. 人生苦短,如果不做改变,人生很快会过去!2021年寻求改变,加油! python自动化办公: 1.相关工具与环境的安装概要: 需要用到python(一种开 ...

  9. Head First 设计模式 —— 11. 组合 (Composite) 模式

    思考题 我们不仅仅要支持多个菜单,升值还要支持菜单中的菜单.你如何处理这个新的设计需求? P355 [提示]在我们的新设计中,真正需要以下三点: P354 我们需要某种属性结构,可以容纳菜单.子菜单和 ...

  10. 【Java基础】Java 语言概述

    Java 语言概述 主要应用场景 JavaEE.大数据.Android 开发方向. 基础知识概述 编程语言核心结构 变量.基本语法.分支.循环.数组.- Java 面向对象的核心逻辑 OOP.封装.继 ...