> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.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>
      راجع [البدء السريع](/ar/get-started/setup/install) لمزيد من التفاصيل حول كيفية تثبيت ClickHouse.
    </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 (كما هو موضح أعلاه)، فإنه يستخدم إعداد 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>
      في هذا الإعداد، تم تكوين cluster مثالي واحد فقط. يجب إما إزالة عناقيد الاختبار النموذجية، أو تحويلها إلى تعليقات، أو إذا كان هناك cluster موجود بالفعل قيد الاختبار، فيجب تحديث المنفذ وإضافة الخيار `<secure>`. ويجب تعيين `<user` و`<password>` إذا كان المستخدم `default` قد جرى تكوينه في الأصل بكلمة مرور أثناء التثبيت أو في ملف `users.xml`.
    </Note>

    يُنشئ ما يلي مجموعةً (cluster) بنسخة مكررة (replica) واحدة لكل شريحة (shard) موزَّعة على خادمَين (خادم على كل عقدة).

    ```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>
      يجب تحديث كل اسم ملف ومسار ليتطابقا مع العقدة التي يُجرى تكوينهما عليها.
      على سبيل المثال، حدّث قيمة `<certificateFile>` إلى `chnode2.crt` عند التكوين على المضيف `chnode2`.
    </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>
    ```

    لمزيد من المعلومات، تفضّل بزيارة [هذه الصفحة](/ar/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 client على عقدة واحدة على الأقل لاستخدام 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
       لن تعمل أوامر [الأحرف الأربعة (4lW)](/ar/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-mintlify-fbfa8bee/3U97coUNTxZWvrPx/images/guides/sre/configuring-ssl_01.png?fit=max&auto=format&n=3U97coUNTxZWvrPx&q=85&s=eaa341c4c992bdbba6403394a98dafe0" 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>
  يجب تحديث كل اسم ملف بحيث يطابق العقدة التي تُجرى عليها التهيئة.
  على سبيل المثال، حدِّث الإدخال `<certificateFile>` ليكون `chnode2.crt` عند التهيئة على المضيف `chnode2`.
</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`    | بدون التحقق من الشهادة. يكون الاتصال مشفّرًا، لكن لا تُتحقَّق هوية الطرف المقابل. استخدم هذا للاختبار فقط.                                                    |
| `relaxed` | يتحقق من شهادة الطرف المقابل إذا قُدِّمت، لكنه لا يفشل إذا لم تُقدَّم أي شهادة.                                                                               |
| `once`    | على جانب الخادم، يتحقق من شهادة العميل أثناء المصافحة الأولية فقط، ويتخطى إعادة التفاوض. وعلى جانب العميل، يتصرف بالطريقة نفسها مثل `relaxed`.                |
| `strict`  | يتطلب شهادة الطرف المقابل ويتحقق منها بالكامل. يفشل الاتصال إذا كانت الشهادة مفقودة أو منتهية الصلاحية أو غير موقَّعة من 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. ستختلف الإعدادات بحسب المتطلبات في بيئات الإنتاج؛ فعلى سبيل المثال، مستويات التحقق من الشهادات، والبروتوكولات، وخوارزميات التشفير، وغيرها. لكن ينبغي أن تكون لديك الآن فكرة واضحة عن الخطوات اللازمة لتهيئة الاتصالات الآمنة وتنفيذها.
