> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Настройка пользовательского SSL-сертификата для аутентификации

> В этом руководстве описаны простые минимально необходимые настройки для аутентификации с помощью пользовательских SSL-сертификатов.

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Не поддерживается в ClickHouse Cloud
        </div>;
};

<CloudNotSupportedBadge />

<Note>
  Эта страница не применима к [ClickHouse Cloud](https://clickhouse.com/cloud). Описанная здесь возможность недоступна в сервисах ClickHouse Cloud.
  Дополнительные сведения см. в руководстве ClickHouse [Cloud Compatibility](/docs/ru/products/cloud/guides/cloud-compatibility).
</Note>

В этом руководстве приведены простые минимальные настройки для аутентификации с помощью пользовательских SSL-сертификатов. Оно основано на [руководстве «Настройка TLS»](/docs/ru/concepts/features/security/tls/configuring-tls).

<Note>
  Аутентификация пользователей по SSL поддерживается при использовании интерфейсов `https`, `native`, `mysql` и `postgresql`.

  Для безопасной аутентификации на узлах ClickHouse должен быть задан параметр `<verificationMode>strict</verificationMode>` (хотя для тестирования подойдет и `relaxed`).

  Если вы используете AWS NLB с интерфейсом MySQL, обратитесь в поддержку AWS, чтобы включить следующую недокументированную опцию:

  > Я хочу иметь возможность настроить proxy protocol v2 для NLB следующим образом: `proxy_protocol_v2.client_to_server.header_placement,Value=on_first_ack`.
</Note>

<Steps>
  <Step title="Создайте SSL-сертификаты пользователя" id="1-create-ssl-user-certificates">
    <Note>
      В этом примере используются самоподписанные сертификаты с самоподписанным CA. Для рабочей среды создайте CSR и отправьте его вашей команде PKI или поставщику сертификатов, чтобы получить корректный сертификат.
    </Note>

    1. Сгенерируйте запрос на подпись сертификата (CSR) и ключ. Базовый формат выглядит следующим образом:
       ```bash theme={null}
       openssl req -newkey rsa:2048 -nodes -subj "/CN=<my_host>:<my_user>"  -keyout <my_cert_name>.key -out <my_cert_name>.csr
       ```
       В этом примере мы используем следующие домен и пользователя для этой тестовой среды:
       ```bash theme={null}
       openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user"  -keyout chnode1_cert_user.key -out chnode1_cert_user.csr
       ```

    <Note>
      Значение CN произвольно, и в качестве идентификатора сертификата можно использовать любую строку. Оно используется при создании пользователя на следующих шагах.
    </Note>

    2. Сгенерируйте и подпишите новый сертификат пользователя, который будет использоваться для аутентификации. Базовый формат выглядит следующим образом:
       ```bash theme={null}
       openssl x509 -req -in <my_cert_name>.csr -out <my_cert_name>.crt -CA <my_ca_cert>.crt -CAkey <my_ca_cert>.key -days 365
       ```
       В этом примере мы используем следующие домен и пользователя для этой тестовой среды:
       ```bash theme={null}
       openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365
       ```
  </Step>

  <Step title="Создайте SQL-пользователя и выдайте разрешения" id="2-create-a-sql-user-and-grant-permissions">
    <Note>
      Подробные сведения о том, как включить SQL-пользователей и назначить роли, см. в руководстве [Defining SQL Users and Roles](/docs/ru/concepts/features/security/access-rights).
    </Note>

    1. Создайте SQL-пользователя, настроенного на аутентификацию по сертификату:
       ```sql theme={null}
       CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user';
       ```

    2. Выдайте привилегии новому пользователю с сертификатом:
       ```sql theme={null}
       GRANT ALL ON *.* TO cert_user WITH GRANT OPTION;
       ```

    <Note>
      В этом упражнении пользователю выданы полные права администратора в демонстрационных целях. Сведения о настройках разрешений см. в [документации ClickHouse по RBAC](/docs/ru/concepts/features/security/access-rights).
    </Note>

    <Note>
      Мы рекомендуем использовать SQL для определения пользователей и ролей. Однако если сейчас вы определяете пользователей и роли в конфигурационных файлах, пользователь будет выглядеть так:

      ```xml theme={null}
      <users>
          <cert_user>
              <ssl_certificates>
                  <common_name>chnode1.marsnet.local:cert_user</common_name>
              </ssl_certificates>
              <networks>
                  <ip>::/0</ip>
              </networks>
              <profile>default</profile>
              <access_management>1</access_management>
              {/* дополнительные параметры*/}
          </cert_user>
      </users>
      ```
    </Note>
  </Step>

  <Step title="Проверка" id="3-testing">
    1. Скопируйте сертификат пользователя, ключ пользователя и CA‑сертификат на удалённый узел.

    2. Настройте OpenSSL в [конфигурации клиента](/docs/ru/concepts/features/interfaces/client#configuration_files) ClickHouse, указав сертификат и пути к файлам.

       ```xml theme={null}
       <openSSL>
           <client>
               <certificateFile>my_cert_name.crt</certificateFile>
               <privateKeyFile>my_cert_name.key</privateKeyFile>
               <caConfig>my_ca_cert.crt</caConfig>
           </client>
       </openSSL>
       ```

    3. Запустите `clickhouse-client`.
       ```bash theme={null}
       clickhouse-client --user <my_user> --query 'SHOW TABLES'
       ```

    <Note>
      Обратите внимание, что пароль, переданный в clickhouse-client, игнорируется, если в конфигурации указан сертификат.
    </Note>
  </Step>

  <Step title="Проверка HTTP" id="4-testing-http">
    1. Скопируйте сертификат пользователя, ключ пользователя и CA‑сертификат на удалённый узел.

    2. Используйте `curl`, чтобы протестировать пример SQL-команды. Базовый формат выглядит следующим образом:
       ```bash theme={null}
       echo 'SHOW TABLES' | curl 'https://<clickhouse_node>:8443' --cert <my_cert_name>.crt --key <my_cert_name>.key --cacert <my_ca_cert>.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: <my_user>" --data-binary @-
       ```
       Например:
       ```bash theme={null}
       echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @-
       ```
       Вывод будет примерно следующим:
       ```response theme={null}
       INFORMATION_SCHEMA
       default
       information_schema
       system
       ```

    <Note>
      Обратите внимание, что пароль не указан: вместо него используется сертификат — так ClickHouse аутентифицирует пользователя.
    </Note>
  </Step>
</Steps>

<div id="summary">
  ## Итоги
</div>

В этой статье были рассмотрены основы создания и настройки пользователя для аутентификации по SSL-сертификату. Этот метод можно использовать с `clickhouse-client` или любыми клиентами, которые поддерживают интерфейс `https` и позволяют задавать HTTP-заголовки. Сгенерированные сертификат и ключ следует хранить в тайне и ограничить к ним доступ, поскольку сертификат используется для аутентификации и авторизации пользователя при выполнении операций в базе данных ClickHouse. Обращайтесь с сертификатом и ключом так же, как с паролями.
