如何使用SslStream类禁用加密?

时间:2017-06-09 11:06:11

标签: c# .net encryption ftp sslstream

我通过TLS/SSL using the SslStream class连接到FTPS服务器。一切都很顺利。但是我需要支持名为" CCC"的命令。这基本上禁用加密。如果我只是这样做:

SendCommand("CCC");
sslStream.Close();
netStream.Write("...<futher FTP commands>...")

然后FTP服务器以看似垃圾数据(大约30个字节)响应,然后在此之后不响应任何命令(超时)。

FTP日志如下:

# Connect()
Status:   Connecting to ***:21
Response: 220-IPv6 connections are also welcome on this server.
Command:  AUTH TLS
Response: 234 AUTH TLS OK.
Status:   FTPS Authentication Successful
Command:  USER ***
Response: 331 User *** OK. Password required
Command:  PASS ***
Response: 230 OK. Current restricted directory is /
Command:  PBSZ 0
Response: 200 PBSZ=0
Command:  PROT P
Response: 200 Data protection level set to "private"
Status:   Text encoding: System.Text.UTF8Encoding
Command:  OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Command:  SYST
Response: 215 UNIX Type: L8
Command:  CCC
Response: 200 Control connection unencrypted
Status:   The stale data was: ************

正如您所见,FTP服务器发回&#34; 200控制连接未加密&#34;这意味着命令成功。同样重要的是要注意,响应是以加密格式发送的。

所以我需要在禁用加密的同时继续使用SslStream。可能是&#34;阻止模式&#34;禁用加密算法时仍需要通信。有谁知道我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

  

“关闭安全连接”和“之间的区别”   放下它?

“关闭安全连接”是指在不关闭底层TCP连接的情况下发送TLS close_notify警报。 SslStreamthrough use of the constructors that take a bool innerStreamOpen argument支持此功能。通常,当您调用findFirst()时,对等方通过交换TLS close_notify消息安全地关闭TLS连接,然后立即关闭底层TCP连接。但是,如果使用将SslStream.Close()参数设置为leaveInnerStreamOpen的SslStream构造函数,则TCP连接不会关闭,并且可能会在其上发送更多不安全的数据。例如,

true

现在实际上手动实现FTP over SSL客户端似乎相当棘手。就个人而言,在尝试编写自己的实现之前,我会寻找现有的成熟实现。

答案 1 :(得分:1)

FixedSslStream班为我工作。当你调用Close()时,它会发送一个SSL close_notify警报!然后,您可以继续将纯文本数据发送到基本流。