> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Настройка TLS

> В этом руководстве описаны простые базовые настройки для конфигурирования ClickHouse с использованием сертификатов OpenSSL для проверки соединений.

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

<CloudNotSupportedBadge />

<Note>
  Эта страница не применима к [ClickHouse Cloud](https://clickhouse.com/cloud). Описанная здесь процедура в сервисах ClickHouse Cloud выполняется автоматически.
</Note>

В этом руководстве приведены простые минимальные настройки для конфигурации ClickHouse с использованием сертификатов OpenSSL для проверки соединений. В этом примере создаются самоподписанные сертификат и ключ центра сертификации (CA), а также сертификаты узлов, чтобы установить соединения с нужными параметрами.

<Note>
  Реализация TLS сложна, и для обеспечения полностью безопасного и надежного развертывания нужно учитывать множество нюансов. Это базовое руководство с примерами настройки одностороннего TLS. Обратитесь к своей команде PKI/безопасности, чтобы сгенерировать сертификаты, подходящие для вашей организации.

  Для общего ознакомления см. это [базовое руководство по использованию сертификатов](https://ubuntu.com/server/docs/security-certificates).
</Note>

<Steps>
  <Step>
    ## Создайте развертывание ClickHouse

    Это руководство написано для Ubuntu 20.04; ClickHouse на указанных ниже хостах устанавливается из DEB-пакета (через apt). Домен: `marsnet.local`:

    | Узел      | IP-адрес      |
    | --------- | ------------- |
    | `chnode1` | 192.168.1.221 |
    | `chnode2` | 192.168.1.222 |
    | `chnode3` | 192.168.1.223 |

    <Note>
      Подробнее об установке ClickHouse см. в руководстве [Быстрый старт](/ru/get-started/setup/install).
    </Note>
  </Step>

  <Step>
    ## Создание TLS-сертификатов

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

    1. Сгенерируйте ключ, который будет использоваться для нового CA:
       ```bash theme={null}
       openssl genrsa -out marsnet_ca.key 2048
       ```

    2. Сгенерируйте новый самоподписанный CA‑сертификат. Следующая команда создаст новый сертификат, который будет использоваться для подписи других сертификатов с помощью ключа CA:
       ```bash theme={null}
       openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt
       ```

    <Note>
      Сохраните резервную копию ключа и CA‑сертификата в безопасном месте вне кластера. После генерации сертификатов узлов ключ следует удалить с узлов кластера.
    </Note>

    3. Проверьте содержимое нового CA‑сертификата:
       ```bash theme={null}
       openssl x509 -in marsnet_ca.crt -text
       ```

    4. Создайте запрос на сертификат (CSR) и сгенерируйте ключ для каждого узла:
       ```bash theme={null}
       openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1" -addext "subjectAltName = DNS:chnode1.marsnet.local,IP:192.168.1.221" -keyout chnode1.key -out chnode1.csr
       openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode2" -addext "subjectAltName = DNS:chnode2.marsnet.local,IP:192.168.1.222" -keyout chnode2.key -out chnode2.csr
       openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode3" -addext "subjectAltName = DNS:chnode3.marsnet.local,IP:192.168.1.223" -keyout chnode3.key -out chnode3.csr
       ```

    5. Используя CSR и CA, создайте новые пары сертификатов и ключей:
       ```bash theme={null}
       openssl x509 -req -in chnode1.csr -out chnode1.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy
       openssl x509 -req -in chnode2.csr -out chnode2.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy
       openssl x509 -req -in chnode3.csr -out chnode3.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy
       ```

    6. Проверьте сертификаты на наличие полей subject и issuer:
       ```bash theme={null}
       openssl x509 -in chnode1.crt -text -noout
       ```

    7. Убедитесь, что новые сертификаты проходят проверку по CA‑сертификату:
       ```bash theme={null}
       openssl verify -CAfile marsnet_ca.crt chnode1.crt
       chnode1.crt: OK
       ```
  </Step>

  <Step>
    ## Создайте и настройте каталог для хранения сертификатов и ключей.

    <Note>
      Это нужно сделать на каждом узле. На каждом хосте используйте соответствующие сертификаты и ключи.
    </Note>

    1. Создайте папку в каталоге, доступном для ClickHouse, на каждом узле. Мы рекомендуем использовать каталог конфигурации по умолчанию (например, `/etc/clickhouse-server`):
       ```bash theme={null}
       mkdir /etc/clickhouse-server/certs
       ```

    2. Скопируйте CA‑сертификат, сертификат узла и соответствующий ему ключ в новый каталог `certs` на каждом узле.

    3. Измените владельца и права доступа, чтобы ClickHouse мог читать сертификаты:

       ```bash theme={null}
       chown clickhouse:clickhouse -R /etc/clickhouse-server/certs
       chmod 600 /etc/clickhouse-server/certs/*
       chmod 755 /etc/clickhouse-server/certs
       ll /etc/clickhouse-server/certs
       ```

       ```response theme={null}
       total 20
       drw-r--r-- 2 clickhouse clickhouse 4096 Apr 12 20:23 ./
       drwx------ 5 clickhouse clickhouse 4096 Apr 12 20:23 ../
       -rw------- 1 clickhouse clickhouse  997 Apr 12 20:22 chnode1.crt
       -rw------- 1 clickhouse clickhouse 1708 Apr 12 20:22 chnode1.key
       -rw------- 1 clickhouse clickhouse 1131 Apr 12 20:23 marsnet_ca.crt
       ```
  </Step>

  <Step>
    ## Настройка среды с базовыми кластерами на основе ClickHouse Keeper

    Для данной среды развёртывания на каждом узле используются следующие настройки ClickHouse Keeper. У каждого сервера будет собственный `<server_id>`. (Например, `<server_id>1</server_id>` для узла `chnode1` и т. д.)

    <Note>
      Для ClickHouse Keeper рекомендуется использовать порт `9281`. Однако порт можно настроить и изменить, если в вашей среде он уже занят другим приложением.

      Полное описание всех параметров см. по адресу [https://clickhouse.com/docs/operations/clickhouse-keeper/](https://clickhouse.com/docs/operations/clickhouse-keeper/)
    </Note>

    1. Добавьте следующий код внутрь тега `<clickhouse>` в файле `config.xml` сервера ClickHouse

    <Note>
      Для продакшн-сред рекомендуется использовать отдельный файл конфигурации `.xml` в каталоге `config.d`.
      Подробнее см. [https://clickhouse.com/docs/operations/configuration-files/](https://clickhouse.com/docs/operations/configuration-files/)
    </Note>

    ```xml theme={null}
    <keeper_server>
        <tcp_port_secure>9281</tcp_port_secure>
        <server_id>1</server_id>
        <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
        <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

        <coordination_settings>
            <operation_timeout_ms>10000</operation_timeout_ms>
            <session_timeout_ms>30000</session_timeout_ms>
            <raft_logs_level>trace</raft_logs_level>
        </coordination_settings>

        <raft_configuration>
            <secure>true</secure>
            <server>
                <id>1</id>
                <hostname>chnode1.marsnet.local</hostname>
                <port>9444</port>
            </server>
            <server>
                <id>2</id>
                <hostname>chnode2.marsnet.local</hostname>
                <port>9444</port>
            </server>
            <server>
                <id>3</id>
                <hostname>chnode3.marsnet.local</hostname>
                <port>9444</port>
            </server>
        </raft_configuration>
    </keeper_server>
    ```

    <Note>
      Когда ClickHouse Keeper встроен в ClickHouse server (как показано выше), Keeper использует конфигурацию OpenSSL сервера, заданную в разделе OpenSSL статьи [Настройка TLS‑интерфейсов на узлах ClickHouse](#5-configure-tls-interfaces-on-clickhouse-nodes). Если ClickHouse Keeper запущен как автономный процесс, необходимо добавить раздел `<openSSL>` в конфигурационный файл Keeper с теми же настройками CA‑сертификата и сертификата/ключа узла. Подробности см. ниже в разделе [Настройка OpenSSL для автономного ClickHouse Keeper](#configure-openssl-for-standalone-clickhouse-keeper).
    </Note>

    2. Раскомментируйте и обновите параметры Keeper на всех узлах, установив флаг `<secure>` равным 1:
       ```xml theme={null}
       <zookeeper>
           <node>
               <host>chnode1.marsnet.local</host>
               <port>9281</port>
               <secure>1</secure>
           </node>
           <node>
               <host>chnode2.marsnet.local</host>
               <port>9281</port>
               <secure>1</secure>
           </node>
           <node>
               <host>chnode3.marsnet.local</host>
               <port>9281</port>
               <secure>1</secure>
           </node>
       </zookeeper>
       ```

    3. Обновите и добавьте следующие настройки кластера на `chnode1` и `chnode2`. `chnode3` будет использоваться для кворума ClickHouse Keeper.

    <Note>
      Для этой конфигурации настроен только один пример кластера. Тестовые кластеры-примеры необходимо либо удалить, либо закомментировать, либо, если тестируется существующий кластер, обновить порт и добавить параметр `<secure>`. Необходимо указать `<user` и `<password>`, если для пользователя `default` изначально был задан пароль при установке или в файле `users.xml`.
    </Note>

    Следующая конфигурация создаёт кластер с одной репликой сегмента на двух серверах (по одному на каждом узле).

    ```xml theme={null}
    <remote_servers>
        <cluster_1S_2R>
            <shard>
                <replica>
                    <host>chnode1.marsnet.local</host>
                    <port>9440</port>
                    <user>default</user>
                    <password>ClickHouse123!</password>
                    <secure>1</secure>
                </replica>
                <replica>
                    <host>chnode2.marsnet.local</host>
                    <port>9440</port>
                    <user>default</user>
                    <password>ClickHouse123!</password>
                    <secure>1</secure>
                </replica>
            </shard>
        </cluster_1S_2R>
    </remote_servers>
    ```

    4. Задайте значения макросов, чтобы создать таблицу ReplicatedMergeTree для тестирования. На `chnode1`:

       ```xml theme={null}
       <macros>
           <shard>1</shard>
           <replica>replica_1</replica>
       </macros>
       ```

       На `chnode2`:

       ```xml theme={null}
       <macros>
           <shard>1</shard>
           <replica>replica_2</replica>
       </macros>
       ```
  </Step>

  <Step>
    ## Настройте TLS-интерфейсы на узлах ClickHouse

    Приведенные ниже параметры настраиваются в `config.xml` сервера ClickHouse

    1. Задайте отображаемое имя для развертывания (необязательно):
       ```xml theme={null}
       <display_name>clickhouse</display_name>
       ```

    2. Настройте ClickHouse на прослушивание внешних портов:
       ```xml theme={null}
       <listen_host>0.0.0.0</listen_host>
       ```

    3. Настройте порт `https` и отключите порт `http` на каждом узле:
       ```xml theme={null}
       <https_port>8443</https_port>
       {/*<http_port>8123</http_port>*/}
       ```

    4. Настройте защищенный TCP-порт ClickHouse Native и отключите стандартный незащищенный порт на каждом узле:
       ```xml theme={null}
       <tcp_port_secure>9440</tcp_port_secure>
       {/*<tcp_port>9000</tcp_port>*/}
       ```

    5. Настройте порт `interserver https` и отключите стандартный незащищенный порт на каждом узле:
       ```xml theme={null}
       <interserver_https_port>9010</interserver_https_port>
       {/*<interserver_http_port>9009</interserver_http_port>*/}
       ```

    6. Настройте OpenSSL, указав сертификаты и пути

    <Note>
      Имена файлов и пути должны быть обновлены в соответствии с узлом, на котором выполняется настройка.
      Например, при настройке узла `chnode2` укажите в записи `<certificateFile>` значение `chnode2.crt`.
    </Note>

    ```xml theme={null}
    <openSSL>
        <server>
            <certificateFile>/etc/clickhouse-server/certs/chnode1.crt</certificateFile>
            <privateKeyFile>/etc/clickhouse-server/certs/chnode1.key</privateKeyFile>
            <verificationMode>relaxed</verificationMode>
            <caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
            <cacheSessions>true</cacheSessions>
            <disableProtocols>sslv2,sslv3</disableProtocols>
            <preferServerCiphers>true</preferServerCiphers>
        </server>
        <client>
            <loadDefaultCAFile>false</loadDefaultCAFile>
            <caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
            <cacheSessions>true</cacheSessions>
            <disableProtocols>sslv2,sslv3</disableProtocols>
            <preferServerCiphers>true</preferServerCiphers>
            <verificationMode>relaxed</verificationMode>
            <invalidCertificateHandler>
                <name>RejectCertificateHandler</name>
            </invalidCertificateHandler>
        </client>
    </openSSL>
    ```

    Дополнительные сведения см. по адресу [https://clickhouse.com/docs/operations/server-configuration-parameters/settings/#server\&#95;configuration\&#95;parameters-openssl](https://clickhouse.com/docs/operations/server-configuration-parameters/settings/#server\&#95;configuration\&#95;parameters-openssl)

    7. Настройте TLS для gRPC на каждом узле:

       ```xml theme={null}
       <grpc>
           <enable_ssl>1</enable_ssl>
           <ssl_cert_file>/etc/clickhouse-server/certs/chnode1.crt</ssl_cert_file>
           <ssl_key_file>/etc/clickhouse-server/certs/chnode1.key</ssl_key_file>
           <ssl_require_client_auth>true</ssl_require_client_auth>
           <ssl_ca_cert_file>/etc/clickhouse-server/certs/marsnet_ca.crt</ssl_ca_cert_file>
           <transport_compression_type>none</transport_compression_type>
           <transport_compression_level>0</transport_compression_level>
           <max_send_message_size>-1</max_send_message_size>
           <max_receive_message_size>-1</max_receive_message_size>
           <verbose_logs>false</verbose_logs>
       </grpc>
       ```

       Дополнительные сведения см. по адресу [https://clickhouse.com/docs/interfaces/grpc/](https://clickhouse.com/docs/interfaces/grpc/)

    8. Настройте клиент ClickHouse как минимум на одном из узлов для использования TLS-соединений в его собственном файле `config.xml` (по умолчанию — в `/etc/clickhouse-client/`):
       ```xml theme={null}
       <openSSL>
           <client>
               <loadDefaultCAFile>false</loadDefaultCAFile>
               <caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
               <cacheSessions>true</cacheSessions>
               <disableProtocols>sslv2,sslv3</disableProtocols>
               <preferServerCiphers>true</preferServerCiphers>
               <invalidCertificateHandler>
                   <name>RejectCertificateHandler</name>
               </invalidCertificateHandler>
           </client>
       </openSSL>
       ```

    9. Отключите порты эмуляции MySQL и PostgreSQL, используемые по умолчанию:
       ```xml theme={null}
       {/*mysql_port>9004</mysql_port*/}
       {/*postgresql_port>9005</postgresql_port*/}
       ```
  </Step>

  <Step>
    ## Тестирование

    1. Запустите все узлы по очереди:
       ```bash theme={null}
       service clickhouse-server start
       ```

    2. Убедитесь, что защищённые порты открыты и прослушиваются; на каждом узле это должно выглядеть примерно так:

       ```bash theme={null}
       root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcp
       ```

       ```response theme={null}
       tcp        0      0 0.0.0.0:9010            0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 0.0.0.0:9440            0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 0.0.0.0:9281            0.0.0.0:*               LISTEN      off (0.00/0/0)
       tcp        0      0 192.168.1.221:33046     192.168.1.222:9444      ESTABLISHED off (0.00/0/0)
       tcp        0      0 192.168.1.221:42730     192.168.1.223:9444      ESTABLISHED off (0.00/0/0)
       tcp        0      0 192.168.1.221:51952     192.168.1.222:9281      ESTABLISHED off (0.00/0/0)
       tcp        0      0 192.168.1.221:22        192.168.1.210:49801     ESTABLISHED keepalive (6618.05/0/0)
       tcp        0     64 192.168.1.221:22        192.168.1.210:59195     ESTABLISHED on (0.24/0/0)
       tcp6       0      0 :::22                   :::*                    LISTEN      off (0.00/0/0)
       tcp6       0      0 :::9444                 :::*                    LISTEN      off (0.00/0/0)
       tcp6       0      0 192.168.1.221:9444      192.168.1.222:59046     ESTABLISHED off (0.00/0/0)
       tcp6       0      0 192.168.1.221:9444      192.168.1.223:41976     ESTABLISHED off (0.00/0/0)
       ```

       | Порт ClickHouse | Описание                          |
       | --------------- | --------------------------------- |
       | 8443            | интерфейс HTTPS                   |
       | 9010            | межсерверный HTTPS-порт           |
       | 9281            | защищённый порт ClickHouse Keeper |
       | 9440            | защищённый нативный TCP-протокол  |
       | 9444            | порт Raft для ClickHouse Keeper   |

    3. Проверьте состояние ClickHouse Keeper
       Типичные команды [из 4 букв (4lW)](/ru/guides/oss/deployment-and-scaling/keeper#four-letter-word-commands) не будут работать с `echo` без TLS; вот как использовать эти команды через `openssl`.
       * Запустите интерактивный сеанс в `openssl`

    ```bash theme={null}
    openssl s_client -connect chnode1.marsnet.local:9281
    ```

    ```response theme={null}
    CONNECTED(00000003)
    depth=0 CN = chnode1
    verify error:num=20:unable to get local issuer certificate
    verify return:1
    depth=0 CN = chnode1
    verify error:num=21:unable to verify the first certificate
    verify return:1
    ---
    Certificate chain
     0 s:CN = chnode1
       i:CN = marsnet.local CA
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIICtDCCAZwCFD321grxU3G5pf6hjitf2u7vkusYMA0GCSqGSIb3DQEBCwUAMBsx
    ...
    ```

    * Отправьте команды 4LW в сеансе OpenSSL

      ```bash theme={null}
      mntr
      ```

      ```response highlight={9,15,24} theme={null}
      ---
      Post-Handshake New Session Ticket arrived:
      SSL-Session:
          Protocol  : TLSv1.3
      ...
      read R BLOCK
      zk_version      v22.7.3.5-stable-e140b8b5f3a5b660b6b576747063fd040f583cf3
      zk_avg_latency  0
      zk_max_latency  4087
      zk_min_latency  0
      zk_packets_received     4565774
      zk_packets_sent 4565773
      zk_num_alive_connections        2
      zk_outstanding_requests 0
      zk_server_state leader
      zk_znode_count  1087
      zk_watch_count  26
      zk_ephemerals_count     12
      zk_approximate_data_size        426062
      zk_key_arena_size       258048
      zk_latest_snapshot_size 0
      zk_open_file_descriptor_count   187
      zk_max_file_descriptor_count    18446744073709551615
      zk_followers    2
      zk_synced_followers     1
      closed
      ```

    4. Запустите клиент ClickHouse, указав флаг `--secure` и порт TLS:
       ```bash theme={null}
       root@chnode1:/etc/clickhouse-server# clickhouse-client --user default --password ClickHouse123! --port 9440 --secure --host chnode1.marsnet.local
       ClickHouse client version 22.3.3.44 (official build).
       Connecting to chnode1.marsnet.local:9440 as user default.
       Connected to ClickHouse server version 22.3.3 revision 54455.

       clickhouse :)
       ```

    5. Войдите в интерфейс Play через `https`-интерфейс по адресу `https://chnode1.marsnet.local:8443/play`.

           <Image img="https://mintcdn.com/private-7c7dfe99-fix-nav-issues/SWirV1yBj-_cP_wu/images/guides/sre/configuring-ssl_01.png?fit=max&auto=format&n=SWirV1yBj-_cP_wu&q=85&s=90def26547eae9681b6320b1bffe0fc9" alt="Настройка TLS" size="md" border width="724" height="348" data-path="images/guides/sre/configuring-ssl_01.png" />

    <Note>
      браузер покажет, что сертификат не является доверенным, поскольку доступ к нему осуществляется с рабочей станции, а сертификаты отсутствуют в хранилищах корневых CA на клиентской машине.
      При использовании сертификатов, выпущенных общедоступным центром сертификации или корпоративным CA, он должен отображаться как доверенный.
    </Note>

    6. Создайте реплицируемую таблицу:

       ```sql theme={null}
       clickhouse :) CREATE TABLE repl_table ON CLUSTER cluster_1S_2R
                   (
                       id UInt64,
                       column1 Date,
                       column2 String
                   )
                   ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/repl_table', '{replica}' )
                   ORDER BY (id);
       ```

       ```response theme={null}
       ┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
       │ chnode2.marsnet.local │ 9440 │      0 │       │                   1 │                0 │
       │ chnode1.marsnet.local │ 9440 │      0 │       │                   0 │                0 │
       └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
       ```

    7. Добавьте несколько строк на `chnode1`:
       ```sql theme={null}
       INSERT INTO repl_table
       (id, column1, column2)
       VALUES
       (1,'2022-04-01','abc'),
       (2,'2022-04-02','def');
       ```

    8. Проверьте репликацию, просмотрев строки на `chnode2`:

       ```sql theme={null}
       SELECT * FROM repl_table
       ```

       ```response theme={null}
       ┌─id─┬────column1─┬─column2─┐
       │  1 │ 2022-04-01 │ abc     │
       │  2 │ 2022-04-02 │ def     │
       └────┴────────────┴─────────┘
       ```
  </Step>
</Steps>

<div id="configure-openssl-for-standalone-clickhouse-keeper">
  ## Настройка OpenSSL для автономного ClickHouse Keeper
</div>

Если ClickHouse Keeper запускается как автономный процесс (а не в составе ClickHouse server), сертификаты и параметры OpenSSL нужно настраивать отдельно в файле конфигурации Keeper. Без этого Keeper не сможет устанавливать защищённые соединения для связи с клиентами (`tcp_port_secure`) и для Raft-репликации между узлами Keeper.

Добавьте следующий раздел `<openSSL>` в файл конфигурации автономного ClickHouse Keeper на каждом узле:

<Note>
  Имя каждого файла нужно изменить в соответствии с узлом, на котором выполняется настройка.
  Например, при настройке на хосте `chnode2` укажите в записи `<certificateFile>` значение `chnode2.crt`.
</Note>

```xml theme={null}
<openSSL>
    <server>
        <certificateFile>/etc/clickhouse-keeper/certs/chnode1.crt</certificateFile>
        <privateKeyFile>/etc/clickhouse-keeper/certs/chnode1.key</privateKeyFile>
        <verificationMode>relaxed</verificationMode>
        <caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
    </server>
    <client>
        <loadDefaultCAFile>false</loadDefaultCAFile>
        <caConfig>/etc/clickhouse-keeper/certs/marsnet_ca.crt</caConfig>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
        <verificationMode>relaxed</verificationMode>
        <invalidCertificateHandler>
            <name>RejectCertificateHandler</name>
        </invalidCertificateHandler>
    </client>
</openSSL>
```

Раздел `<server>` используется для входящих клиентских подключений на защищённом порту Keeper (`tcp_port_secure`). Раздел `<client>` используется для исходящих подключений между узлами Keeper во время репликации Raft.

<Note>
  В примерах выше для сертификатов используется путь `/etc/clickhouse-keeper/certs/` — это типичный путь для автономных установок Keeper. Если вы установили Keeper в другой каталог, скорректируйте путь соответствующим образом. Сами сертификаты — те же, что были созданы на [шаге 2](#2-create-tls-certificates).
</Note>

<div id="openssl-verification-modes">
  ## Режимы проверки OpenSSL и обработчики сертификатов
</div>

Конфигурация `<openSSL>` поддерживает несколько вариантов для `<verificationMode>` и `<invalidCertificateHandler>`, которые определяют, как ClickHouse проверяет TLS-сертификаты. Эти настройки применяются к clickhouse-server, clickhouse-client и автономному ClickHouse Keeper.

<div id="verification-modes">
  ### Режимы проверки
</div>

Задайте `<verificationMode>` в разделе `<server>` или `<client>` элемента `<openSSL>`:

| Режим     | Описание                                                                                                                                                                                       |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `none`    | Проверка сертификата не выполняется. Соединение шифруется, но подлинность узла `peer` не проверяется. Используйте этот режим только для тестирования.                                          |
| `relaxed` | Проверяет сертификат узла `peer`, если он предоставлен, но не завершает соединение с ошибкой, если сертификат отсутствует.                                                                     |
| `once`    | На стороне сервера проверяет сертификат клиента только при первоначальном рукопожатии и пропускает повторное согласование. На стороне клиента работает так же, как `relaxed`.                  |
| `strict`  | Требует сертификат узла `peer` и полностью проверяет его. Соединение завершается с ошибкой, если сертификат отсутствует, просрочен или не подписан доверенным CA. Рекомендуется для продакшна. |

<div id="invalid-certificate-handlers">
  ### Обработчики недействительных сертификатов
</div>

Задайте `<invalidCertificateHandler>` в разделе `<server>` или `<client>` внутри `<openSSL>`. Этот обработчик определяет, что происходит при сбое проверки сертификата. На стороне сервера он управляет реакцией на недействительные клиентские сертификаты. На стороне клиента он управляет реакцией на недействительные сертификаты сервера.

| Обработчик                 | Описание                                                                                                   |
| -------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `RejectCertificateHandler` | Отклоняет соединение, если сертификат недействителен. Это значение по умолчанию и рекомендуемая настройка. |
| `AcceptCertificateHandler` | Принимает соединение, даже если сертификат недействителен. Используйте это только для тестирования.        |

<div id="disabling-certificate-verification">
  ### Пример: отключение проверки сертификата
</div>

<Warning>
  Отключение проверки сертификата отключает проверку подлинности TLS и делает соединения уязвимыми для атак типа «человек посередине». Используйте эту конфигурацию только в изолированных средах разработки или тестирования.
</Warning>

Чтобы полностью отключить проверку сертификата (например, при использовании самоподписанных сертификатов в тестовой среде), задайте для `verificationMode` значение `none` и используйте `AcceptCertificateHandler`.

Для `clickhouse-client` также можно использовать флаг командной строки `--accept-invalid-certificate`, который автоматически применяет оба параметра.

**clickhouse-client** (`/etc/clickhouse-client/config.xml`):

```xml theme={null}
<openSSL>
    <client>
        <loadDefaultCAFile>false</loadDefaultCAFile>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
        <verificationMode>none</verificationMode>
        <invalidCertificateHandler>
            <name>AcceptCertificateHandler</name>
        </invalidCertificateHandler>
    </client>
</openSSL>
```

**clickhouse-server** (`config.xml` или файл в `config.d/`). В разделе `<server>` по-прежнему нужно указать пути к сертификату и ключу, поскольку сервер должен предъявлять клиентам собственный сертификат, даже если он не проверяет их сертификаты:

```xml theme={null}
<openSSL>
    <server>
        <certificateFile>/etc/clickhouse-server/certs/server.crt</certificateFile>
        <privateKeyFile>/etc/clickhouse-server/certs/server.key</privateKeyFile>
        <verificationMode>none</verificationMode>
        <caConfig>/etc/clickhouse-server/certs/ca.crt</caConfig>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
    </server>
    <client>
        <loadDefaultCAFile>false</loadDefaultCAFile>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
        <verificationMode>none</verificationMode>
        <invalidCertificateHandler>
            <name>AcceptCertificateHandler</name>
        </invalidCertificateHandler>
    </client>
</openSSL>
```

**Автономный ClickHouse Keeper** (файл конфигурации Keeper):

```xml theme={null}
<openSSL>
    <server>
        <certificateFile>/etc/clickhouse-keeper/certs/keeper.crt</certificateFile>
        <privateKeyFile>/etc/clickhouse-keeper/certs/keeper.key</privateKeyFile>
        <verificationMode>none</verificationMode>
        <caConfig>/etc/clickhouse-keeper/certs/ca.crt</caConfig>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
    </server>
    <client>
        <loadDefaultCAFile>false</loadDefaultCAFile>
        <cacheSessions>true</cacheSessions>
        <disableProtocols>sslv2,sslv3</disableProtocols>
        <preferServerCiphers>true</preferServerCiphers>
        <verificationMode>none</verificationMode>
        <invalidCertificateHandler>
            <name>AcceptCertificateHandler</name>
        </invalidCertificateHandler>
    </client>
</openSSL>
```

<div id="summary">
  ## Краткое резюме
</div>

В этой статье мы рассмотрели настройку среды ClickHouse с использованием TLS. Параметры в продакшн-среде будут отличаться в зависимости от требований; например, уровни проверки сертификатов, протоколы, шифры и т. д. Но теперь вы должны лучше понимать, какие шаги нужны для настройки и внедрения защищённых соединений.
