Я сделал простой клиент ftp в C #, который делает то, что мне нужно (подключиться к ftp, опционально используя прокси-сервер), но я также хочу использовать AUTH SSL.
Поэтому вместо NetworkStream я посмотрел на SslStream и надеялся, что это будет довольно простой заменой.
Однако, похоже, у меня много проблем при рукопожатии с моим (glftpd, самоподписанным сертификатом openssl) ftp. Вот фрагмент кода:
TcpClient client = new TcpClient("192.168.0.2", 1337);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
null
);
try
{
sslStream.AuthenticateAsClient("192.168.0.2"); // or "glftpd", neither worked.
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
return;
}
Я нарушаю AuthenticateAsClient с IOException: «Рукопожатие не удалось из-за непредвиденного формата пакета.».
Я не нарушаю ValidateServerCertificate (никогда не достигнуто).
Мне трудно отладить эту ошибку, поскольку я могу установить порт TcpClient равным 1208219421 и все еще получать ту же ошибку (поэтому я даже не знаю, не удается ли установить связь с портом ssl).
Код (из 3-4 различных руководств C # ssl, которые я просматривал) выше изменен из текст ссылки
Я пробовал как sslStream.AuthenticateAsClient (..., ..., SslProtocols.Tls, false) и sslStream.AuthenticateAsClient (..., ..., SslProtocols.Ssl3, false) Ssl2 и Default, и Я точно знаю, что TLS работает с моей установкой glftpd.
Если бы мне пришлось угадать, я бы подумал, что это как-то связано с именем машины / именем сертификата, но я пробовал имя сертификата (это «glftpd»), так что сейчас я не знаю, почему я потерпел неудачу рукопожатие.
Также следует отметить, что сертификат является самоподписанным.
Любая помощь очень ценится!