Загрузка PowerSpps ftps, вызывающая ошибку «Соединение DATA прервано без выключения ssl» при закрытии потока - PullRequest
0 голосов
/ 31 марта 2019

У меня есть следующий код, который я построил на чем-то, что я нашел в Интернете (не помню где)

$Server = XXXXX
$port = XXX
$remotepath='/'
$username = 'XXXX'
#$passward = ConvertTo-SecureString -AsPlainText 'XXXX' -Force 
$password = 'XXXXX'
$file = "path-to-file"

$f = Get-Item $File
$remote_url = "ftp://$Server`:$Port$RemotePath"

[System.Net.FtpWebRequest]$req = [System.Net.FtpWebRequest]::Create($remote_url + $f.Name)
# [System.Net.FtpWebRequest]$req = [System.Net.WebRequest]::Create($remote_url + $f.Name)
$req.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$req.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$req.EnableSsl = $true
$req.UseBinary = $true
$req.UsePassive = $true
$req.KeepAlive = $true
$req.ConnectionGroupName = "FTPS_$Username"
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {return $true}
$fs = New-Object IO.FileStream $f.FullName, 'Open', 'Read'
$req.ContentLength = $f.Length
$ftpStream = $req.GetRequestStream()

$b = New-Object Byte[](10000)

do {
   $ftpStream.Write($b, 0, $r)
   $r = $fs.Read($b, 0, 10000)
} while ($r -ne 0)

if ($fs -ne $null) { $fs.Dispose() }
$ftpStream.Close()    
$resp = $req.GetResponse()
$resp.StatusDescription
$resp.Close()

файл загружен нормально, однако, когда следующая строка помечена:

$ftpStream.Close() 

вызывает на сервере (vsftp в ubuntu) следующую ошибку:

Sun Mar 31 13:58:13 2019 [pid 3779] [XXXX] DEBUG: Client "XXX.XXX.XXX.XXX", "DATA connection terminated without SSL shutdown. Buggy client! Integrity of upload cannot be asserted."
Sun Mar 31 13:58:13 2019 [pid 3780] [XXXX] FTP response: Client "XXX.XXX.XXX.XXX", "426 Failure reading network stream."
Sun Mar 31 13:58:13 2019 [pid 3780] [XXXX] FAIL UPLOAD: Client "XXX.XXX.XXX.XXX", "/file-path", 36851 bytes, 0.21Kbyte/sec
Sun Mar 31 13:58:13 2019 [pid 3779] [XXXX] DEBUG: Client "XXX.XXX.XXX.XXX", "Control connection terminated without SSL shutdown."

, что в свою очередь вызывает следующую строку в моем коде:

$resp = $req.GetResponse()

потерпеть неудачу с:

Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (426) Connection closed; transfer aborted."
At line:3 char:13
+             $resp = $req.GetResponse()
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

будет очень признательна за любую помощь, так как очень важно, чтобы скрипт надежно предупреждал о неудачной или успешной загрузке.

============= ОБНОВЛЕНИЕ =============

Ну, я не публикую это обновление как ответ (по крайней мере, пока), потому что это скорее обходной путь, чем правильное решение.

Я нашел этот пост на китайском языке: https://blog.yuwu.me/?p=1159, из которого я ничего не понял (он был буквально китайским для меня), но он сделал квоту на часть документации vsftpd:

strict_ssl_read_eof Если этот параметр включен, загрузка данных SSL должна завершаться через SSL, а не EOF в сокете. Эта опция Требуется убедиться, что злоумышленник не завершил загрузку преждевременно с фальшивым TCP FIN. сожале- по умолчанию он не включен, потому что очень немногие клиенты понимают это правильно. (Новое в версии 2.0.7).

Default: NO

Я добавил эту настройку в свою конфигурацию, и вот, мой скрипт успешно завершился. Тем не менее, сервер продолжает выдавать ошибку «Соединение DATA прервано без отключения SSL. Багги клиент! Целостность загрузки не может быть подтверждена». но, по крайней мере, он больше не прерывает мой канал управления.

очевидно, что реальным решением было бы правильно разорвать соединение для передачи данных, так что, надеюсь, кто-то сможет успешно решить эту проблему.

...