SslStream принять сертификат? - PullRequest
4 голосов
/ 16 декабря 2009

Я сделал простой клиент 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»), так что сейчас я не знаю, почему я потерпел неудачу рукопожатие.

Также следует отметить, что сертификат является самоподписанным.

Любая помощь очень ценится!

  • Chuck

1 Ответ

1 голос
/ 17 декабря 2009

Вы проверили номер порта? Это проблема?

РЕДАКТИРОВАТЬ 1

http://en.wikipedia.org/wki/FTPS

Возможно, ваш сервер не находится в "неявном" режиме? Это должно быть?

Возможно, вам также нужна поддержка явного режима в вашем продукте.

РЕДАКТИРОВАТЬ 2

(Извините, я пока не могу комментировать, недостаточно повторений, поэтому вместо этого я делаю правки. :-))

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

РЕДАКТИРОВАТЬ 3

Зависит от того, управляете ли вы серверами / насколько вы соответствуете стандартам!

Неявный режим будет считаться немного менее стандартным, но OTOH - менее трудоемким.

РЕДАКТИРОВАТЬ 4

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

РЕДАКТИРОВАТЬ 5

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

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