让python的FTP_TLS支持implicit ssl/tls FTP

python自带的ftplib中有FTP_TLS类,支持连接带ssl的FTP。但implicitssl/tls FTP要求客户端在建立socket链接之后立刻用 ssl/tls 加密,否则不会发送欢迎信息。由于FTP_TLS并没有重载基类FTP的connect方法,因此并不能和implicit  ssl/tls FTP正确连接。我们需要修改FTP_TLS来解决次问题。采用继承的方法,代码如下:


class tyFTP(FTP_TLS):
	def __init__(self, host='', user='', passwd='', acct='', keyfile=None,
		certfile=None, timeout=60):
		FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, timeout)
	def connect(self, host='', port=0, timeout=-999):
		'''Connect to host.  Arguments are:
		- host: hostname to connect to (string, default previous host)
		- port: port to connect to (integer, default previous port)
		'''
		if host != '':
			self.host = host
		if port > 0:
			self.port = port
		if timeout != -999:
			self.timeout = timeout
		try:
			self.sock = socket.create_connection((self.host, self.port), self.timeout)
			self.af = self.sock.family
			#add this line!!!
			self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile,ssl_version=ssl.PROTOCOL_TLSv1)
			#add end
			self.file = self.sock.makefile('rb')
			self.welcome = self.getresp()
		except Exception as e:
			print e
		return self.welcome

这样就能成功connect到implicit  ssl/tls ftp的端口了(一般是990)。login也不会有问题。在login之后需要调用prot_p()方法,标明之后的数据通信都进行 ssl/tls 加密,才能正确的执行ftp指令。

关于implicit  ssl/tls ftp,大概介绍如下:

以FTP/SSL为例:

隐式TLS-服务器在990端口监听,客户端建立TCP连接,然后建立SSL连接,然后进行USER PASS的ftp 认证。其间是没有 AUTH TLS这种特殊command的。

显式TLS-服务器仍然在21端口监听,客户端正常发起tcp连接、服务器返回hello、客户端发起AUTH TLS-至此建立了TLS认证,以后才是加密状态。如果服务器设置了必须使用TLS,则当server hello后,客户端试图不建立SSL连接而直接进行USER PASS的ftp认证,服务器会踢掉客户端。

简而言之:

隐式TLS-干脆利落,服务器listen一个单独端口,上来就直接SSL加密,然后才建立应用层会话。

显式TLS-保持最大的兼容性,还是混在原来的端口,只是应用层会话一旦建立,就用特殊的命令来建立SSL会话。

所谓隐式TLS/显式TLS,区别主要在是否独立开监听端口上。

隐式TLS的实现,都是要求服务器单独listen一个特殊端口,客户端连接后直接建立SSL会话,然后再进行应用协议的command,整个过程都是加密的;而显式TLS的实现,是在原应用协议的基础上改进,增加了TLS认证的command,并且server不占用单独的端口。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 `socket_set_option` 函数设置 SSL/TLS 加密通信需要先创建一个 SSL/TLS 上下文,然后将该上下文应用到 socket 上。具体的步骤如下: 1. 创建一个 SSL/TLS 上下文,可以使用 OpenSSL 库提供的函数进行创建,比如 `openssl_pkey_new`、`openssl_x509_read`、`openssl_pkcs12_read` 等。 2. 使用 `stream_context_create` 函数创建一个上下文,将 SSL/TLS 上下文作为参数传入。 3. 使用 `stream_socket_enable_crypto` 函数将 SSL/TLS 上下文应用到 socket 上,使其支持 SSL/TLS 加密通信。 下面是一个使用 `socket_set_option` 函数设置 SSL/TLS 加密通信的示例代码: ```php $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1); // 创建 SSL/TLS 上下文 $sslContext = stream_context_create(); stream_context_set_option($sslContext, 'ssl', 'local_cert', '/path/to/cert.pem'); stream_context_set_option($sslContext, 'ssl', 'local_pk', '/path/to/private/key.pem'); // 将 SSL/TLS 上下文应用到 socket 上 stream_socket_enable_crypto($server, true, STREAM_CRYPTO_METHOD_TLS_SERVER, $sslContext); ``` 在上面的示例代码中,我们使用了 `stream_context_create` 函数创建了一个上下文 `$sslContext`,并使用 `stream_context_set_option` 函数设置了 SSL/TLS 上下文的相关参数,包括证书路径、私钥路径等。然后,我们使用 `stream_socket_enable_crypto` 函数将 SSL/TLS 上下文 `$sslContext` 应用到 socket `$server` 上,使其支持 SSL/TLS 加密通信。 需要注意的是,在使用 SSL/TLS 加密通信时,客户端和服务端都需要支持 SSL/TLS,否则无法建立加密通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值