From aaa4bd5d8b288299f772332859d1095b382c0b86 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Tue, 9 Dec 2025 00:41:58 +0800 Subject: [PATCH] [chore] update README --- README.md | 73 +++++++++++++++++++++-------- README_EN.md | 89 +++++++++++++++++++++++++----------- cert/crossdesk.cn.key | 27 ----------- cert/crossdesk.cn_bundle.crt | 72 ----------------------------- 4 files changed, 115 insertions(+), 146 deletions(-) delete mode 100644 cert/crossdesk.cn.key delete mode 100644 cert/crossdesk.cn_bundle.crt diff --git a/README.md b/README.md index 36de749..4a39bec 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,18 @@ # CrossDesk Server -[English](README.md) / [中文](README_CN.md) +[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]() +[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) +[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk-server)](https://github.com/kunkundi/crossdesk-server/commits/web-client) +[![Build Status](https://github.com/kunkundi/crossdesk-server/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions) +[![Docker Pulls](https://img.shields.io/docker/pulls/crossdesk/crossdesk-server)](https://hub.docker.com/r/crossdesk/crossdesk-server/tags) +[![GitHub issues](https://img.shields.io/github/issues/kunkundi/crossdesk-server.svg)]() +[![GitHub stars](https://img.shields.io/github/stars/kunkundi/crossdesk-server.svg?style=social)]() +[![GitHub forks](https://img.shields.io/github/forks/kunkundi/crossdesk-server.svg?style=social)]() + +[ [English](README_EN.md) / 中文 ] 为 [CrossDesk](https://github.com/kunkundi/crossdesk) 设计的服务端,支持WSS加密连接,使用SQLite3存储用户信息。 -[License: LGPL-3.0](LICENSE) | [Platform: Windows | Linux | macOS] - --- ## 如何编译 @@ -47,11 +54,9 @@ sudo docker build -t image-name . ## 运行容器 -### 基础启动(数据存储在容器内) - -启动命令示例: +### 启动命令 ```bash -docker run -d \ +sudo docker run -d \ --name crossdesk_server \ --network host \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \ @@ -65,22 +70,50 @@ docker run -d \ crossdesk/crossdesk-server:v1.1.2 ``` -**说明**: -- 证书文件会在首次启动时自动生成在容器内的 `/var/lib/crossdesk/certs` -- 数据库文件会自动创建在容器内的 `/var/lib/crossdesk/db/crossdesk-server.db` -- 日志文件会自动创建在容器内的 `/var/log/crossdesk/` -- **注意**:如果不挂载 volume,容器删除后数据会丢失 +上述命令中,用户需注意的参数如下: + +**参数** +- EXTERNAL_IP:服务器公网 IP , 对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器地址** +- INTERNAL_IP:服务器内网 IP +- CROSSDESK_SERVER_PORT:自托管服务使用的端口,对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器端口** +- COTURN_PORT: COTURN 服务使用的端口, 对应 CrossDesk 客户端**自托管服务器配置**中填写的**中继服务端口** +- MIN_PORT/MAX_PORT:COTURN 服务使用的端口范围,例如:MIN_PORT=50000, MAX_PORT=60000,范围可根据客户端数量调整。 - `-v /var/lib/crossdesk:/var/lib/crossdesk`:持久化数据库和证书文件到宿主机 - `-v /var/log/crossdesk:/var/log/crossdesk`:持久化日志文件到宿主机 -- 容器删除后,数据仍保留在宿主机上 -- **目录自动创建**:如果宿主机没有这些目录,Docker 会自动创建,容器内的代码也会自动创建子目录 -- **权限注意(重要)**:如果 Docker 自动创建的目录权限不足(属于 root),容器内用户无法写入,会导致: + +**示例**: +```bash +sudo docker run -d \ + --name crossdesk_server \ + --network host \ + -e EXTERNAL_IP=114.114.114.114 \ + -e INTERNAL_IP=10.0.0.1 \ + -e CROSSDESK_SERVER_PORT=9099 \ + -e COTURN_PORT=3478 \ + -e MIN_PORT=50000 \ + -e MAX_PORT=60000 \ + -v /var/lib/crossdesk:/var/lib/crossdesk \ + -v /var/log/crossdesk:/var/log/crossdesk \ + crossdesk/crossdesk-server:v1.1.2 +``` + +**注意**: +- **服务器需开放端口:COTURN_PORT/udp,COTURN_PORT/tcp,MIN_PORT-MAX_PORT/udp,CROSSDESK_SERVER_PORT/tcp。** +- 如果不挂载 volume,容器删除后数据会丢失 +- 证书文件会在首次启动时自动生成并持久化到宿主机的 `/var/lib/crossdesk/certs` 路径下 +- 数据库文件会自动创建并持久化到宿主机的 `/var/lib/crossdesk/db/crossdesk-server.db` 路径下 +- 日志文件会自动创建并持久化到宿主机的 `/var/log/crossdesk/` 路径下 + +**权限注意**:如果 Docker 自动创建的目录权限不足(属于 root),容器内用户无法写入,会导致: - 证书生成失败,容器启动脚本会报错退出 - 数据库目录创建失败,程序会抛出异常并崩溃 - 日志目录创建失败,日志文件无法写入(但程序可能继续运行) - 解决方案:在启动容器前手动设置权限: - ```bash - sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk - sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk - ``` \ No newline at end of file +**解决方案**:在启动容器前手动设置权限: +```bash +sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk +sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk +``` + +## 证书文件 +在宿主机的 `/var/lib/crossdesk/certs` 路径下可找到证书文件 `crossdesk.cn_root.crt`,下载到你的客户端主机,并在客户端的**自托管服务器设置**中选择相应的**证书文件路径**。 \ No newline at end of file diff --git a/README_EN.md b/README_EN.md index d73dfe5..a8fa0f5 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,11 +1,18 @@ # CrossDesk Server -[中文](README_CN.md) / [English](README.md) +[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]() +[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) +[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk-server)](https://github.com/kunkundi/crossdesk-server/commits/web-client) +[![Build Status](https://github.com/kunkundi/crossdesk-server/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions) +[![Docker Pulls](https://img.shields.io/docker/pulls/crossdesk/crossdesk-server)](https://hub.docker.com/r/crossdesk/crossdesk-server/tags) +[![GitHub issues](https://img.shields.io/github/issues/kunkundi/crossdesk-server.svg)]() +[![GitHub stars](https://img.shields.io/github/stars/kunkundi/crossdesk-server.svg?style=social)]() +[![GitHub forks](https://img.shields.io/github/forks/kunkundi/crossdesk-server.svg?style=social)]() + +[ [中文](README.md) / English ] Server designed for [CrossDesk](https://github.com/kunkundi/crossdesk) , supporting WSS-encrypted connections and using SQLite3 to store user information. -[License: LGPL-3.0](LICENSE) | [Platform: Windows | Linux | macOS] - --- Requirements: @@ -45,11 +52,9 @@ sudo docker build -t image-name . ## Run Container -### Basic Startup (Data stored in container) - -Example startup command: -```bash -docker run -d \ +### Startup Command +``` +sudo docker run -d \ --name crossdesk_server \ --network host \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \ @@ -63,22 +68,52 @@ docker run -d \ crossdesk/crossdesk-server:v1.1.2 ``` -**Notes**: -- Certificate files will be automatically generated on first startup in `/var/lib/crossdesk/certs` (inside container) -- Database file will be automatically created at `/var/lib/crossdesk/db/crossdesk-server.db` (inside container) -- Log files will be automatically created in `/var/log/crossdesk/` (inside container) -- **Note**: Data will be lost if container is removed without volume mounts -- `-v /var/lib/crossdesk:/var/lib/crossdesk`: Persist database and certificate files to host -- `-v /var/log/crossdesk:/var/log/crossdesk`: Persist log files to host -- Data will remain on host even if container is removed -- **Auto directory creation**: If these directories don't exist on host, Docker will create them automatically, and the container code will also create subdirectories -- **Permission note (Important)**: If Docker auto-created directories have insufficient permissions (owned by root), the container user cannot write, which will cause: - - Certificate generation failure, container startup script will exit with error - - Database directory creation failure, program will throw exception and crash - - Log directory creation failure, log files cannot be written (but program may continue running) - - Solution: Set permissions manually before starting container: - ```bash - sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk - sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk - ``` \ No newline at end of file +The parameters you need to pay attention to are as follows: + +**Parameters** +- **EXTERNAL_IP**: The server’s public IP. This corresponds to **Server Address** in the CrossDesk client’s **Self-Hosted Server Configuration**. +- **INTERNAL_IP**: The server’s internal IP. +- **CROSSDESK_SERVER_PORT**: The port used by the self-hosted service. This corresponds to **Server Port** in the CrossDesk client’s **Self-Hosted Server Configuration**. +- **COTURN_PORT**: The port used by the COTURN service. This corresponds to **Relay Service Port** in the CrossDesk client’s **Self-Hosted Server Configuration**. +- **MIN_PORT / MAX_PORT**: The port range used by the COTURN service. Example: `MIN_PORT=50000`, `MAX_PORT=60000`. Adjust the range depending on the number of clients. +- `-v /var/lib/crossdesk:/var/lib/crossdesk`: Persists database and certificate files on the host machine. +- `-v /var/log/crossdesk:/var/log/crossdesk`: Persists log files on the host machine. + +**Example**: +```bash +sudo docker run -d \ + --name crossdesk_server \ + --network host \ + -e EXTERNAL_IP=114.114.114.114 \ + -e INTERNAL_IP=10.0.0.1 \ + -e CROSSDESK_SERVER_PORT=9099 \ + -e COTURN_PORT=3478 \ + -e MIN_PORT=50000 \ + -e MAX_PORT=60000 \ + -v /var/lib/crossdesk:/var/lib/crossdesk \ + -v /var/log/crossdesk:/var/log/crossdesk \ + crossdesk/crossdesk-server:v1.1.2 +``` + +**Notes** +- **The server must open the following ports: COTURN_PORT/udp, COTURN_PORT/tcp, MIN_PORT–MAX_PORT/udp, and CROSSDESK_SERVER_PORT/tcp.** +- If you don’t mount volumes, all data will be lost when the container is removed. +- Certificate files will be automatically generated on first startup and persisted to the host at `/var/lib/crossdesk/certs`. +- The database file will be automatically created and stored at `/var/lib/crossdesk/db/crossdesk-server.db`. +- Log files will be created and stored at `/var/log/crossdesk/`. + +**Permission Notice** +If the directories automatically created by Docker belong to root and have insufficient write permissions, the container user may not be able to write to them. This can cause: + - Certificate generation failure, leading to startup script errors and container exit. + - Database directory creation failure, causing the program to throw exceptions and crash. + - Log directory creation failure, preventing logs from being written (though the program may continue running). + +**Solution:** Manually set permissions before starting the container: +```bash +sudo mkdir -p /var/lib/crossdesk /var/log/crossdesk +sudo chown -R $(id -u):$(id -g) /var/lib/crossdesk /var/log/crossdesk +``` + +### Certificate Files +You can find the certificate file `crossdesk.cn_root.crt` at `/var/lib/crossdesk/certs` on the host machine. +Download it to your client device and select it in the **Certificate File Path** field under the CrossDesk client’s **Self-Hosted Server Settings**. \ No newline at end of file diff --git a/cert/crossdesk.cn.key b/cert/crossdesk.cn.key deleted file mode 100644 index 3af7206..0000000 --- a/cert/crossdesk.cn.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAzUxxh/mrb2eNgadso3w0Goq5yUHrP0V+yToZrWPvbaoZ8Rnn -rxiTlqOxqol/Uryj5Vxe5MG+t/VfLntsp0h6hMawEGz+v+UMNnLCRGjoCmxkuhRD -MEQkuCEzt9dsqKwdpLir5w3XVTmusqWMiVEg6j6Pg5R6y+6UcbEhOMJXnscKvpsj -jXYZk/7ZcXjfFW3d0N2fC/No3XJwde/KkvM6xWPkin3F4cpWNueYYAh+27KGmZ0W -aDrupO+glxcztYFhQoigdcSC67nz5QqCMerOvGQe8hlPed+q73zguXA8g0CJAAzN -PdFMQnyalJ5Pqj7yYA8YvwwbmUcpUofU+qT6TQIDAQABAoIBAQCqc7ara/sPsw2F -QYnsrvnfs6CPXeDBFqUu08Nv99JZ3epOCPEYqrIXV2/ypNiGzELT8v6Cte3wdJSD -VkyfE4lN5l1WNfjJQJYEOwHapLNLvDVhXeNvFpTaIA79q6n23Xh7RCzN2OsZQpwu -jU8Cz84hTrH/UG8oFL1BLAzmQE1ZcHGTwjuakZ7yu7dUOevW0D1IOcuSp3eoseEs -0Q3SI/5YvSbEc1t7Pi1lE4VC3TDQr0wvYALe9sv8UUkt2zW2t5I5H1OTwIBBri5u -jJzueQQfY78NGDFsSc9gz4N+ERsLKFQo5vPVUIa0lRc97dlovY7cTj0P6rmdH5WI -VxeZTMFNAoGBAPTZqCMWcbezpMMCxKnIUZkZrkK6au9Y0VbKjT/wnr/98jZ3UqzG -g0nuXmYqtOEgd/I9GA202al1Fhg59NCxysM+fcf1+bNd6sobZhKvWWZo3/RFEtZe -FNjDX0KtZhaV2FsPg+PJRxbcKc4adIdGp9My/U3I6A67j2wBbTpvwpZbAoGBANal -tqXA3xEDl5VOULFfI4D+1VmieTwH5OuDNIkRBkBVR+A17TBASp2rKE84gnaCJT1H -IreuIFXelBaOFxe5f8iYZRk2d9xy5pGh4dgzLOpxnjD8V3aKzf0luiXgGCnBfH0H -uo7LFQvArxj2XRr6cGrowFGcZggwtW+Q+3CM+yJ3AoGAKC13G5rZOi2uQZm4r6uB -SEAgii6Q0YmfgEBogS94vURsdGeMF3HTpVQKBXXIjJCJXiSMR+N/PAFMiNkpxP0H -qpYcia1hNf+ZQWTRkQtY/icDaM/U0XxKq28TuJs/f0FDaV3YZI5oreWeroVEzdXY -QB3D1vm6qoA4fp6VT9t68LUCgYBJvBlXLT8ziAldZ86+b5Exsdi2duKwpYGVCbhV -UXzVQrZzJfM5vQwkx3QMarweW6zRNQuPD4jaFqDGcr8qDjYAQaGRHK3mE65y3qpH -a6UFUExoRXcCKMKEMJ6WfjmutmG+TZZfkRHEvMcpixAGwXs2rofKQTCnpZveHG7T -hgqLFwKBgCsRDf/5JZ8yCYh85vTHQX0n5xW3wKve2riTBtmHBeGcTOQ7z+8X5Pa6 -GEjnd2GbkDKaSHocy2ot1uQTFMYm4XnRuZ2LIUA/oHvQg3liJxogtLhT9neouOJG -SVAUmQdHv6sNOXsHfpaYQ4Yh9WnkFsfQXkZPezKxnfjDC0P32dOR ------END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/cert/crossdesk.cn_bundle.crt b/cert/crossdesk.cn_bundle.crt deleted file mode 100644 index 6349a6d..0000000 --- a/cert/crossdesk.cn_bundle.crt +++ /dev/null @@ -1,72 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIG6TCCBNGgAwIBAgIQDZm+gzszyTuYChEbhggd6TANBgkqhkiG9w0BAQsFADBb -MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg -SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y -NTA2MjUwMDAwMDBaFw0yNTA5MjIyMzU5NTlaMBcxFTATBgNVBAMTDGNyb3NzZGVz -ay5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM1McYf5q29njYGn -bKN8NBqKuclB6z9Ffsk6Ga1j722qGfEZ568Yk5ajsaqJf1K8o+VcXuTBvrf1Xy57 -bKdIeoTGsBBs/r/lDDZywkRo6ApsZLoUQzBEJLghM7fXbKisHaS4q+cN11U5rrKl -jIlRIOo+j4OUesvulHGxITjCV57HCr6bI412GZP+2XF43xVt3dDdnwvzaN1ycHXv -ypLzOsVj5Ip9xeHKVjbnmGAIftuyhpmdFmg67qTvoJcXM7WBYUKIoHXEguu58+UK -gjHqzrxkHvIZT3nfqu984LlwPINAiQAMzT3RTEJ8mpSeT6o+8mAPGL8MG5lHKVKH -1Pqk+k0CAwEAAaOCAuswggLnMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFpPNkRlkp1 -aVDAMB0GA1UdDgQWBBT8NCVx9oSYA++8lE/j3r/Bsff42zApBgNVHREEIjAgggxj -cm9zc2Rlc2suY26CEHd3dy5jcm9zc2Rlc2suY24wPgYDVR0gBDcwNTAzBgZngQwB -AgEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4G -A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIweQYI -KwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9UcnVz -dEFzaWFEVlRMU1JTQUNBMjAyNS5jcnQwDAYDVR0TAQH/BAIwADCCAYAGCisGAQQB -1nkCBAIEggFwBIIBbAFqAHcA3dzKNJXX4RYF55Uy+sef+D0cUN/bADoUEnYKLKy7 -yCoAAAGXpRLksAAABAMASDBGAiEAqG3yUcSmVpRitnMX3kN6P9PmTtcpdG/yVXKz -db0Ycb0CIQDQ9gxdkKsrHyeA8p07RKGHuf/A3hgu6EROcwR1ZJJPBQB3AO08S9bo -BsKkogBX28sk4jgB31Ev7cSGxXAPIN23Pj/gAAABl6US5LUAAAQDAEgwRgIhAK2+ -C7tpf+Q28e34GG4lRjrRL/FRUq3C+r4kEepRajtCAiEAzFCM23xDdS4ndtGa2xdI -eP5oEjV3WJ+D402ws4W+y3gAdgCkQsUGSWBhVI8P1Oqc+3otJkVNh6l/L99FWfYn -TzqEVAAAAZelEuTFAAAEAwBHMEUCIQC77g5B+dpccZlLu7RHbO1n0C5PkfFfmTYZ -rqSSm8BvMgIgZsyw/WWW8LXJU7T1naVkC3ES8PuNTt+M9paTVzlpcBUwDQYJKoZI -hvcNAQELBQADggIBAGAVWbdXOk1FzP47+KPdJsFmS/Jtz0y6Jg79JRj5VKODAk2g -hRDXT/PtPyj3D2od0yiOR8ShKEiVScBlJ0A7xgjW3kvLHhGvgRffdLRz5AStYE1/ -ntz8kT38Ad1S/lB9Ct1lvASszZ7ab9C22X461RM0rHT0gviwovIkqG4qTs7EFIDp -FmP9OnQEQPtEO3qg670f0+RLcwHjht47m68ilFDNcVcw10JmawbPORpR6D2npqhL -9HukhSdBryxhNBsjcwtp3gNXwMo7ffc1ZyvCQk9xbfzELIhcyAiA/OKcrQpx77AN -DltHVSQRcNc8XFfHaZCPBXWtJ6G1GdjX2uWvXfxfioaej0sL6v7SRl1QRwDB6JiX -NXdx/6o94iSLImOktoywds5g9/qpQS+0YWXIhziTJQtqaF0hFbSn55Pc95tbNnqA -M9ZHS3SmoB0155ueGsYBJBc4R01E6tgE/xYYPpD7MrjJCYIymeLP0DbYWii+BBlb -4ICeVJ7g4i9Un8vU6khx9B3x3JqO7NPjhY/18iejoOGddOing4Vn2FyHhc/fI5X6 -ct+sLDOOTEf3BnkTEarhwzFQMTiYP3k4lD0KVvMMvvOzMVagQvGKog1jsEuCnuoe -9OJrxpY8kQVGSZqKaeEHwJZw9+KTXTa+y+GBp2Pxq3oybGuV1fRuJ3Hogq6S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFnjCCBIagAwIBAgIQCSYyO0lk42hGFRLe8aXVLDANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0yNTAxMDgwMDAwMDBaFw0zNTAxMDcyMzU5NTlaMFsxCzAJBgNVBAYTAkNO -MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSUwIwYDVQQD -ExxUcnVzdEFzaWEgRFYgVExTIFJTQSBDQSAyMDI1MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA0fuEmuBIsN6ZZVq+gRobMorOGIilTCIfQrxNpR8FUZ9R -/GfbiekbiIKphQXEZ7N1uBnn6tXUuZ32zl6jPkZpHzN/Bmgk1BWSIzVc0npMzrWq -/hrbk5+KddXJdsNpeG1+Q8lc8uVMBrztnxaPb7Rh7yQCsMrcO4hgVaqLJWkVvEfW -ULtoCHQnNaj4IroG6VxQf1oArQ8bPbwpI02lieSahRa78FQuXdoGVeQcrkhtVjZs -ON98vq5fPWZX2LFv7e5J6P9IHbzvOl8yyQjv+2/IOwhNSkaXX3bI+//bqF9XW/p7 -+gsUmHiK5YsvLjmXcvDmoDEGrXMzgX31Zl2nJ+umpRbLjwP8rxYIUsKoEwEdFoto -Aid59UEBJyw/GibwXQ5xTyKD/N6C8SFkr1+myOo4oe1UB+YgvRu6qSxIABo5kYdX -FodLP4IgoVJdeUFs1Usa6bxYEO6EgMf5lCWt9hGZszvXYZwvyZGq3ogNXM7eKyi2 -20WzJXYMmi9TYFq2Fa95aZe4wki6YhDhhOO1g0sjITGVaB73G+JOCI9yJhv6+REN -D40ZpboUHE8JNgMVWbG1isAMVCXqiADgXtuC+tmJWPEH9cR6OuJLEpwOzPfgAbnn -2MRu7Tsdr8jPjTPbD0FxblX1ydW3RG30vwLF5lkTTRkHG9epMgpPMdYP7nY/08MC -AwEAAaOCAVYwggFSMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLQSKKW0 -wB2fKXFpPNkRlkp1aVDAMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485 -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -dgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy -dC5jb20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E -aWdpQ2VydEdsb2JhbFJvb3RHMi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov -L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDARBgNV -HSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQELBQADggEBAJ4a3svh316GY2+Z7EYx -mBIsOwjJSnyoEfzx2T699ctLLrvuzS79Mg3pPjxSLlUgyM8UzrFc5tgVU3dZ1sFQ -I4RM+ysJdvIAX/7Yx1QbooVdKhkdi9X7QN7yVkjqwM3fY3WfQkRTzhIkM7mYIQbR -r+y2Vkju61BLqh7OCRpPMiudjEpP1kEtRyGs2g0aQpEIqKBzxgitCXSayO1hoO6/ -71ts801OzYlqYW9OQQQ2GCJyFbD6XHDjdpn+bWUxTKWaMY0qedSCbHE3Kl2QEF0C -ynZ7SbC03yR+gKZQDeTXrNP1kk5Qhe7jSXgw+nhbspe0q/M1ZcNCz+sPxeOwdCcC -gJE= ------END CERTIFICATE----- \ No newline at end of file