Сбой соединения SSL без аутентификации на стороне клиента - PullRequest
0 голосов
/ 26 апреля 2018

Я прочитал, что аутентификация на стороне клиента является необязательной, поэтому я пытаюсь подключиться к своему серверу SSL без аутентификации на стороне клиента.Когда я делаю это, я получаю следующую ошибку на сервере:

, in accept_connection
    ssl_version=ssl.PROTOCOL_SSLv23
  File "/usr/lib/python2.7/ssl.py", line 933, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 601, in __init__
    self.do_handshake()
  File "/usr/lib/python2.7/ssl.py", line 830, in do_handshake
    self._sslobj.do_handshake()
SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)

Вот код работающего сервера и клиента, все работает нормально, когда я аутентифицируюсь на стороне клиента, но ошибка появляется, когда я комментируюиз этой строки.

Сервер (python):

def accept_connection(self, sock):
    client, (addr, port) = sock.accept()
    sslclient = ssl.wrap_socket(
        client,
        server_side=True,
        certfile=self.ssl_cert_file,
        keyfile=self.ssl_key_file,
        ssl_version=ssl.PROTOCOL_SSLv23
    )

Клиент (C #):

public bool Connect()
    {
        try
        {
            client = new TcpClient(this.ServerAddress, this.ServerPort);

            sslStream = new SslStream(
                client.GetStream(),
                false,
                new RemoteCertificateValidationCallback(ValidateCert),
                null
            );

            try
            {
                sslStream.AuthenticateAsClient(this.ServerAddress);
            }
            catch (AuthenticationException e)
            {
                sslStream = null;
                client.Close();
                client = null;
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }

        return true;
    }

Выше приведен рабочий код без ошибок.

Когда я закомментирую следующий код на клиенте:

//sslStream.AuthenticateAsClient(this.ServerAddress);

Вышеприведенная ошибка Python обнаруживается, и клиентское соединение не выдает никаких исключений и продолжает работать до своего первогочитать, а затем завершается неудачно с:

This operation is only allowed using a successfully authenticated context.

Как я могу выполнить эту работу, если я не звоню AuthenticateAsClient?

Вот так я генерирую certfile и keyfile

openssl req -x509 -newkey rsa:1024 -keyout my.key -out my.crt -days 365 -nodes -subj "/C=US/ST=VA/L=Junk/O=None/OU=Junk/CN=example.local"

Python версии 2.

Возможно, я только что был дезинформирован о том, что вызов AuthenticateAsClient является необязательным?

1 Ответ

0 голосов
/ 30 апреля 2018

Ssl сертификат клиента аутентификация действительно необязательна.Это когда клиент отправляет свой сертификат на сервер, и сервер проверяет, является ли этот сертификат действительным, ожидает ли сервер, и проверяет подлинность клиента с этим сертификатом.

Однако это не то, что выполняется

sslStream.AuthenticateAsClient(this.ServerAddress);

Как указано в документации, этот метод

Вызывается клиентами на , аутентифицирует сервер и, необязательно, клиент в соединении клиент-сервер.

Аутентификация сервера (проверка правильности его сертификата, выданного для ожидаемого домена, выданного доверенным органом) является обязательным этапом рукопожатия ssl.Например, используя описание по этой ссылке , мы видим, что шаг 3:

Клиент SSL или TLS проверяет цифровой сертификат сервера

Серверожидает от клиента выполнения этого шага.По этой причине, если вы пропустите этот шаг, комментируя вызов AuthenticateAsClient - ваш сервер python правильно жалуется на нарушение протокола.

Чтобы использовать аутентификацию клиента, вы должны использовать другую перегрузку:

X509CertificateCollection clientCerts = GetClientCerts();
sslStream.AuthenticateAsClient(this.ServerAddress, clientCerts, true);

Поскольку вы этого не делаете - вы не выполняете (необязательно) аутентификацию клиента.

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