关于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. sqli-labs第5关布尔盲注pyhton脚本

    import requests import os #此函数先判断数据库长度 def length(url,str): num = 1 while True: str_num = '%d' %num ...

  2. PHP 直接使用html输出excel

    1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...

  3. Linux系列之makefile的简单入门

    什么是makefile呢? 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...

  4. Python制作塔防小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块.

  5. java基础:数组详解以及应用,评委打分案例实现,数组和随机数综合,附练习案列

    1.数组 1.1 数组介绍 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致. 1.2 数组的定义格式 1.2.1 第一种格式 数据类型[] 数组名 示例: int[] arr;     ...

  6. HCIP----静态实验

    要求: 1.全网可达 2.拓扑中所需地址全部基于192.168.0.0/24划分所得 3.使用静态路由 4.R1有三个环回,需要汇总 5.PC1与PC3属于同一VLAN,PC2和PC4属于同一VLAN ...

  7. H3C路由器配置——动态路由OSPF协议

    一.介绍 1.OSPF协议介绍 (1).OSPF(Open Shortest Path First,开放最短路径优先)路由协议是用于网际协议(IP)网络的链路状态路由协议.是一个被各厂商设备广泛支持的 ...

  8. 使用metadata-extractor获取照片中的位置、曝光度、大小...

    使用metadata-extractor实现获取图片中的属性信息 官网:https://drewnoakes.com/code/exif/ 简介:metadata-extractor允许您通过简单的A ...

  9. IDEA 使用Git clone项目【建议】

    1.在启动页点击Get from Version Control进行克隆,这样可以减少不必要克隆Bug. 2.项目目录保持一致(保证文件的正确性),父级目录不要有其它任何文件(防止文件名冲突) 3.通 ...

  10. 原生小程序中实现将scss文件实时编译为wxss文件

    参考链接 全局安装gulp,方便以后直接执行gulp命令 npm install gulp -g 用原生小程序新建一个项目 在小程序根目录(app.js同级目录)中新建package.json文件 n ...