> ## 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.

# Настройка TLS

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

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

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 выполняется автоматически.
</Note>

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

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

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

<Steps>
  <Step title="Создайте развертывание ClickHouse" id="1-create-a-clickhouse-deployment">
    Это руководство написано для 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 см. в руководстве [Быстрый старт](/docs/ru/get-started/setup/install).
    </Note>
  </Step>

  <Step title="Создание TLS-сертификатов" id="2-create-tls-certificates">
    <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 title="Создайте и настройте каталог для хранения сертификатов и ключей." id="3-create-and-configure-a-directory-to-store-certificates-and-keys">
    <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 title="Настройка среды с базовыми кластерами на основе ClickHouse Keeper" id="4-configure-the-environment-with-basic-clusters-using-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 title="Настройте TLS-интерфейсы на узлах ClickHouse" id="5-configure-tls-interfaces-on-clickhouse-nodes">
    Приведенные ниже параметры настраиваются в `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>
    ```

    Дополнительные сведения см. на [этой странице](/docs/ru/reference/settings/server-settings/settings#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 title="Тестирование" id="6-testing">
    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)](/docs/ru/guides/oss/deployment-and-scaling/keeper/index#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/k4wNHsd_gyvah7Fr/images/guides/sre/configuring-ssl_01.webp?fit=max&auto=format&n=k4wNHsd_gyvah7Fr&q=85&s=2ceba49f8121f52b620eeeefbf97a43f" alt="Настройка TLS" size="md" border width="724" height="348" data-path="images/guides/sre/configuring-ssl_01.webp" />

    <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. Параметры в продакшн-среде будут отличаться в зависимости от требований; например, уровни проверки сертификатов, протоколы, шифры и т. д. Но теперь вы должны лучше понимать, какие шаги нужны для настройки и внедрения защищённых соединений.
