FTP使用Socket SSL流程认证(一)
关于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流程认证(一)的更多相关文章
- SSL双向认证和SSL单向认证的流程和区别
refs: SSL双向认证和SSL单向认证的区别https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证!https://cloud.tenc ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- SSL双向认证java实现(转)
本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...
- JAVA中SSL证书认证通讯
JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...
- Java实现 SSL双向认证
我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法.这个就是所谓的SSL单向认证. 但是实际中,我们有可能还会验证客户端是否符合要求,也就 ...
- C++ windows客户端支持SSL双向认证
C++ windows客户端支持SSL双向认证,服务端是JAVA开发的,使用的证书是jks格式的.C++并不支持JKS格式的证书,所以要用openssl进行转换下. 1. 需要先把jks转成.p12文 ...
- 什么是SSL双向认证,与单向认证证书有什么区别?
SSL/TLS证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是, ...
- tomcat配置SSL双向认证
一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ...
- sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
sendEmail发送邮件是出现以下报错: ******************************************************************* Using the ...
随机推荐
- zabbix学习(一)——LNMP环境搭建及zabbix安装
第一部分:LNMP环境搭建 一.环境说明: OS: centos7.6_x64nginx:nginx-1.16.0php: php-7.1.11mysql:mysql-5.6.44 zabbi ...
- python 简单逻辑回归实例
import sys reload(sys) sys.setdefaultencoding('utf-8') from sklearn.feature_extraction.text import T ...
- 一个简单的CSS示例
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 & ...
- java 的IO类库的基本架构
java IO 操作的类在java.io 包中,大概可以分为以下几组: 基于字节操作的接口:InputStream 和 OutputStream 基于字符操作的接口:Writer 和 Reader 基 ...
- java使用map去重复
public class Test { public static void main(String[] args) { Map<Number, String> map1 = new Ha ...
- PP模块的组织架构
组织架构的层次,从上而下依次是: (1),集团-->对应系统client级别,用户登录SAP系统时,每一个client就是对应一个集团:在数据库中,每一个client都对应一个唯一的标识. (2 ...
- 如何理解java枚举,看例子
先来看一下不用枚举怎么表示常量: //常量类 class Num { public static String ONE = "ONE"; public static String ...
- Java Hash表 数据结构
思考: 数组由于内存地址连续,是一种查询快增删慢的数据结构: 链表由于内存地址不连续,是一种查询慢增删快的数据结构: 那么怎么实现查询又快,增删也快的数据结构呢? 要是把数组和链表结合起来会怎么样? ...
- Linux 路由 策略路由
Linux 路由 策略路由 目录 Linux 路由 策略路由 一.路由表 编辑路由表配置文件:/etc/iproute2/rt_tables添加删除修改路由表 二.IP策略 查看IP策略 添加IP策略 ...
- 第十五章节 BJROBOT cartographer 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
建地图前说明:请确保你的小车已经校正好 IMU.角速度.线速度,虚拟机配置好 ROS 网络的前提进行,否则会造成构建地图无边界.虚拟机端无法正常收到小车主控端发布的话题数据等异常情况!! 1.把小车平 ...