switch to Caddy reverse proxy with auto HTTPS

Replace manual nginx + SSL certificates with Caddy for automatic
Let's Encrypt certificate management. Remove direct HTTP port exposure,
route web traffic through Caddy (80/443) via Docker internal network.
SSH remains on port 2222.
This commit is contained in:
2026-04-23 21:05:07 +08:00
parent 83ca0632f6
commit af7d49b685
9 changed files with 60 additions and 206 deletions

View File

@@ -17,3 +17,6 @@ GITEA__lfs__PATH=/data/git/lfs
# 禁用公开注册(仅管理员可创建账号) # 禁用公开注册(仅管理员可创建账号)
GITEA__service__DISABLE_REGISTRATION=true GITEA__service__DISABLE_REGISTRATION=true
# 域名配置Caddy 反向代理 + 自动 HTTPS
DOMAIN=git.example.com

4
.gitignore vendored
View File

@@ -4,5 +4,9 @@ data/
# 环境变量(可能包含敏感信息) # 环境变量(可能包含敏感信息)
.env .env
# Caddy 数据
caddy_data/
caddy_config/
# macOS # macOS
.DS_Store .DS_Store

3
Caddyfile Normal file
View File

@@ -0,0 +1,3 @@
{$DOMAIN} {
reverse_proxy gitea:3000
}

View File

@@ -1,26 +1,39 @@
# Gitea 局域网部署 # Gitea Docker 部署Caddy 反向代理 + 自动 HTTPS
使用 Docker Compose 部署 Gitea Git 服务 使用 Docker Compose 部署 Gitea,通过 Caddy 反向代理实现自动 HTTPSLet's Encrypt
## 架构
```
Client → Caddy (80/443, 自动 HTTPS) → Gitea (3000, Docker 内部网络)
Gitea SSH (22 → 宿主机 2222)
```
- **Caddy** 处理 HTTPS 证书的自动申请、续期和 HTTP→HTTPS 重定向
- **Gitea** Web 流量通过 Docker 内部网络由 Caddy 代理,不直接暴露端口
- **SSH** 直接映射到宿主机 2222 端口,不经过 Caddy
## 快速开始 ## 快速开始
### 1. 配置环境变量 ### 前提条件
复制并编辑 `.env` 文件: - 域名已解析到服务器公网 IP
- 服务器 80、443、2222 端口可从外网访问
### 1. 配置环境变量
```bash ```bash
cp .env.example .env cp .env.example .env
``` ```
修改端口等配置: 编辑 `.env`,关键配置:
```env ```env
HTTP_PORT=3000 # Web 界面端口 DOMAIN=git.example.com # 你的域名Caddy 将为此域名申请 HTTPS 证书)
SSH_PORT=2222 # SSH 端口(宿主机端口,容器内仍为 22 SSH_PORT=2222 # SSH 端口(宿主机端口,容器内仍为 22
``` ```
> `GITEA__server__SSH_PORT` 通过 `.env` 传递给容器,告知 Gitea 对外 SSH 端口为 `2222` > `GITEA__server__SSH_PORT` 通过 `.env` 传递给容器,使 Web 界面中的 SSH clone 地址正确显示端口号。
> 使 Web 界面中的 SSH clone 地址正确显示端口号。
### 2. 启动服务 ### 2. 启动服务
@@ -28,21 +41,22 @@ SSH_PORT=2222 # SSH 端口(宿主机端口,容器内仍为 22
docker compose up -d docker compose up -d
``` ```
Caddy 会自动为 `DOMAIN` 申请 Let's Encrypt 证书,稍等片刻后即可通过 HTTPS 访问。
### 3. 初始配置 ### 3. 初始配置
首次访问 `http://<服务器IP>:3000` 会进入安装向导: 首次访问 `https://<DOMAIN>` 会进入安装向导:
1. 设置管理员账户 1. 设置管理员账户
2. 配置服务器域名(可选) 2. 数据库已默认使用 SQLite
3. 数据库已默认使用 SQLite
## 访问方式 ## 访问方式
| 方式 | 地址 | | 方式 | 地址 |
|-----|------| |-----|------|
| Web 界面 | `http://<IP>:3000` | | Web 界面 | `https://<DOMAIN>` |
| HTTP 克隆 | `git clone http://<IP>:3000/<用户>/<仓库>.git` | | HTTPS 克隆 | `git clone https://<DOMAIN>/<用户>/<仓库>.git` |
| SSH 克隆 | `git clone ssh://git@<IP>:2222/<用户>/<仓库>.git` | | SSH 克隆 | `git clone ssh://git@<DOMAIN>:2222/<用户>/<仓库>.git` |
## Git LFS ## Git LFS
@@ -69,6 +83,7 @@ tar -xzvf gitea-backup-20260320.tar.gz
``` ```
重要文件: 重要文件:
- `data/gitea/gitea.db` - 用户和配置数据 - `data/gitea/gitea.db` - 用户和配置数据
- `data/git/repositories/` - 仓库数据 - `data/git/repositories/` - 仓库数据
- `data/git/lfs/` - LFS 文件 - `data/git/lfs/` - LFS 文件
@@ -85,6 +100,9 @@ docker compose down
# 查看日志 # 查看日志
docker compose logs -f docker compose logs -f
# 查看 Caddy 日志
docker compose logs -f caddy
# 重启 # 重启
docker compose restart docker compose restart

View File

@@ -8,13 +8,29 @@ services:
- GITEA__lfs__PATH=${GITEA__lfs__PATH} - GITEA__lfs__PATH=${GITEA__lfs__PATH}
- GITEA__service__DISABLE_REGISTRATION=${GITEA__service__DISABLE_REGISTRATION} - GITEA__service__DISABLE_REGISTRATION=${GITEA__service__DISABLE_REGISTRATION}
- GITEA__server__SSH_PORT=${GITEA__server__SSH_PORT} - GITEA__server__SSH_PORT=${GITEA__server__SSH_PORT}
- GITEA__server__ROOT_URL=https://${DOMAIN}/
- GITEA__server__DOMAIN=${DOMAIN}
- GITEA__server__SSH_DOMAIN=${DOMAIN}
restart: always restart: always
volumes: volumes:
- ./data:/data - ./data:/data
ports: ports:
- "${HTTP_PORT}:3000"
- "${SSH_PORT}:22" - "${SSH_PORT}:22"
caddy:
image: caddy:2
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy_data:/data
- ./caddy_config:/config
depends_on:
- gitea
networks: networks:
default: default:
driver: bridge driver: bridge

View File

@@ -1,19 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDBDCCAewCAQAwgY4xCzAJBgNVBAYTAkNOMRAwDgYDVQQIEwdCZWlqaW5nMRAw
DgYDVQQHEwdCZWlqaW5nMQ8wDQYDVQQKEwZxY2xvdWQxDzANBgNVBAsTBnFjbG91
ZDEbMBkGA1UEAxMSZ2l0LmJhbWJvb2dhbWVzLmNuMRwwGgYDVQQFExM3MDEwNTI2
MTc0NjEwMDEzMDcwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAywxO
GXhpMKk5OL6yBuKONtYe3mgNZSV3QyC2gUjIlLWiHcM0sfWI5fxdHzWA3lzUESt4
F1Tfwr7T0xSZ+OM1HvrFYbUSqHcC+ARUnof0MbItpndojebo/hGw8tJQwnQruOyt
rOqWRcjN5q5+TZenhwwX19ttpSEEuyI0/7vdYiQhYRIvsSAuIQ6vaPT34D5trwH3
GZlypr7brZOVTmn1sHkElvIy4TKITpRcP8QAyGeBOuvPHSHaHUAXG01UkZNLtNQx
i1pRtLuBqnexiSxhLhgFLk2UN9SNgM+3OPCzChhe+2K4BXhjdWRDRTXT9VngIuDg
TBXh2uznfv6D7OhPbwIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHREEFjAU
ghJnaXQuYmFtYm9vZ2FtZXMuY24wDQYJKoZIhvcNAQELBQADggEBAEUfO7MwkJw8
7zBYFfxvPlOlfXmF7geHw/3AnpCmslAVHQxzKMdET2K2FZb6aEvzbPNkt8eee7uD
Toe8nbJPgPgFVbtSbhu5sMDdHHcOJPtYisxEdholMsB9uUg9dQyYBWyB4jdZMtfv
z1QzfkJPSFDCEN0olMWj2sbD0OZVP5+CHiMvv4oKbJN5MMpXFZipzUwLPNs7xF0a
CdwUuShf03wH78zL59IEYt26EllqmQNRYSCvchRthBfVYaATtQui3jFiyJ72hvzc
PjuPntcx6YVQYDG47RhKOaC8/9LHwIwcKtJPILlHqQKmwcQWLbYkKBJMhhA7UMet
mqYdqfxXWpA=
-----END CERTIFICATE REQUEST-----

View File

@@ -1,27 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAywxOGXhpMKk5OL6yBuKONtYe3mgNZSV3QyC2gUjIlLWiHcM0
sfWI5fxdHzWA3lzUESt4F1Tfwr7T0xSZ+OM1HvrFYbUSqHcC+ARUnof0MbItpndo
jebo/hGw8tJQwnQruOytrOqWRcjN5q5+TZenhwwX19ttpSEEuyI0/7vdYiQhYRIv
sSAuIQ6vaPT34D5trwH3GZlypr7brZOVTmn1sHkElvIy4TKITpRcP8QAyGeBOuvP
HSHaHUAXG01UkZNLtNQxi1pRtLuBqnexiSxhLhgFLk2UN9SNgM+3OPCzChhe+2K4
BXhjdWRDRTXT9VngIuDgTBXh2uznfv6D7OhPbwIDAQABAoIBAEUKbhPjCYFuSPKu
hMIqjsi+jch6APP/hUnh+ayEHw/RosoT8fsAzgfFg7R08NirH8Cm0zK7vUnusP/4
5VHnj8x04GCUvT9jGDNU5aDyAWpUd4k+2OJHPboGMfCe6q7z6Vn7wCInsekQmlJx
yqh/hIs65XCUP/gB/iXTP8olCuWvX+I727QitR+uIj02tgIrpGofqvoq3VvScpj7
Gvw/3o36oyQUW9Ugt++2nbe1jFxMZhKxi0QOop2p7Ylm7642Hw/A5JxOAHLJ9V/7
7SzKT8iJZBH8Pw/ivVgbPajHiJvyKJEGaLIVESlgxqMubtLNCZnfRpCU3MN1Op5t
f0C4EQECgYEA08iMZ6Id1eiISFQerZBWxFrC+GW4q/LdXnNyAtlHQ5spVprzMsni
aBZXuxPii90ziGeLoTOnqxmKmw66P+JKp5S/L6NnwdloQw8hlcJRLP2JXfYjxIbF
/nR+r8fIu5zyomjJAN7VmoqDNz3aQMlqLVqsRq9giTgIFleR8g1t6aECgYEA9XDe
Zq+Vpy9vW8jd+SZ7pNn3V7yuAR+A0uN92DhyHWgOvHlcDf9dk+Bki69bx+MnE/5v
9uOHEMZDt0oNn35HJ/DX+oo4id+1fRRcEai3rRpw0r5LWCsV2d8jhBw4/7QoZV1a
guXG6Xg0udIWNbyMtmzAGyc3DdKF/l/9cB5ZPw8CgYBLTCGHcx9Sf4N829OweAIx
e+eYM2puUEIeo8MkeiYZRmBzN1JCe37w7QiyLga9HZ+F3vLJFLmHXuRl7t2PeyB5
5qv2/w0T4f1s4kNZoKYF7fraGnprFFPu/XJRgyG+erXVwpW8pn2hnZ+7k1U29aW3
jGZ2F0KmZvKRJv9v5RBwIQKBgQCTyrYw8RPVSyvsAeUfzPtxBcr5quTASl8BHfk+
RKb6bBlLhmxXBWkszVbeAebrUy3JzVFQQiunfytxaAcR/jEMrOrws2BeLTYUrjjO
bWDEvIIpdGrcGX2b5tB1EaWE28/jUbZZ0dDX7wkYx5eWHgZBJvT6pL9y9Ey5IsXy
SGQHIwKBgQCuNM34bDSzTsRwRmr0HG4DSInc/leLN//fEWKrfOicCo6GTuHCOyjD
JxTSUWan3uyzIFJI11OKWm+telXbzdCzUZoVoGDoi9hU1jBpGeaZs5nxaTDQigap
EDEI48i092McV68pCNVyj/1TW3pwg8VW2GpStY0U0uc1E6fgXe3/zw==
-----END RSA PRIVATE KEY-----

View File

@@ -1,72 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIG2TCCBMGgAwIBAgIQDiI8Ol3M8OHu6nJ6cbTqOjANBgkqhkiG9w0BAQsFADBb
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y
NjA0MjMwMDAwMDBaFw0yNjA3MjEyMzU5NTlaMB0xGzAZBgNVBAMTEmdpdC5iYW1i
b29nYW1lcy5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMsMThl4
aTCpOTi+sgbijjbWHt5oDWUld0MgtoFIyJS1oh3DNLH1iOX8XR81gN5c1BEreBdU
38K+09MUmfjjNR76xWG1Eqh3AvgEVJ6H9DGyLaZ3aI3m6P4RsPLSUMJ0K7jsrazq
lkXIzeaufk2Xp4cMF9fbbaUhBLsiNP+73WIkIWESL7EgLiEOr2j09+A+ba8B9xmZ
cqa+262TlU5p9bB5BJbyMuEyiE6UXD/EAMhngTrrzx0h2h1AFxtNVJGTS7TUMYta
UbS7gap3sYksYS4YBS5NlDfUjYDPtzjwswoYXvtiuAV4Y3VkQ0U10/VZ4CLg4EwV
4drs537+g+zoT28CAwEAAaOCAtUwggLRMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFp
PNkRlkp1aVDAMB0GA1UdDgQWBBSCAXFrvb9mYpKL3ua40hg+QkyOKzAdBgNVHREE
FjAUghJnaXQuYmFtYm9vZ2FtZXMuY24wPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAn
BggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB
/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATB5BggrBgEFBQcBAQRtMGswJAYI
KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3
aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL1RydXN0QXNpYURWVExTUlNBQ0Ey
MDI1LmNydDAMBgNVHRMBAf8EAjAAMIIBgAYKKwYBBAHWeQIEAgSCAXAEggFsAWoA
dgDCMX5XRRmjRe5/ON6ykEHrx8IhWiK/f9W1rXaa2Q5SzQAAAZ259IEWAAAEAwBH
MEUCIFL1pBL/7olfxuB3l7pL2qiNHghmHRbspTTP8ciYAZ4uAiEAybJLiXAxs2k/
D51CWbVEZthLvqApXOpannaI1ehUXooAdwDYCVU7lE96/8gWGW+UT4WrsPj8XodV
Jg8V0S5yu0VLFAAAAZ259IPVAAAEAwBIMEYCIQDktRKhH2Alo3H5nv8dKYIQcsat
l1YLiweSJCTLBnwBQgIhAJIQ+BmV6ObgMYdU+J3hn1vDjfF1yWkOzFYy9ElFKcpn
AHcAlE5Dh/rswe+B8xkkJqgYZQHH0184AgE/cmd9VTcuGdgAAAGdufSBJQAABAMA
SDBGAiEA2YbbOGMgc7VgALCecgkcCc2tGWtNxLi4d1MGtNrJvYgCIQCTKOw+yz+Y
nAoP4zdXXzTywyEMrZyBkIXcSCY45vPqFTANBgkqhkiG9w0BAQsFAAOCAgEArTD4
s92olE+wwrmCrqiBBkeVuwZ9rjxmKpsNUsFXonsO0mZ5mrnxZ2tv7mQ9C+dtfZ3d
kslvYEpcQTSijTX4sMKVPs20SSHGX5fsj6UHWrEjhIq4oFajkovZxOxKJPPcZVt9
MrhoTJxZatmB/vLJwOz/H94N80rf0O5/r1VVyAyiEOrFfPp1ZZsHmPOxAPk/YXXE
x1yQIaW5/9GV148XnbGf9F1LBt1/uexkILGlJjBsa0X3QEKADih3+PIzAY293/5b
TQVFG5LbQV8xvCyUqQQVQgN4PPdHJBqzp2bDEpL/b7whJppXu+lcAE7n8Y3dvWHM
4plil8JoqLM7GkYKcj2bcGNwB93a8X5BYpgxh3qUULv96jWTl+QorMWIRrSJMHbO
y1IrDkGDrik9tsA0zDqKYC2qIx1F72PPkul3NmGPPsDHXG1AYfrw6+DOSocnrBPj
Ym8vBl9WcvS7BcYgqg1MTda+6M9VIYJrgFviMgFJ87fNZN2RYDLmRsftJFiDSX/4
F2Q/d4NFLVaVtsdxzIx86HP4E2A1g3VswAFkvcBjO5g3ZAhPZ7dqv60GZ/QPLio/
QyPIncRq5MbCsQC3IkOCXVR1XBrOHIXFxgSMHfnifo9RBeUfYArPyCHiYvJZZBv/
Bj8F9U7Muky3HSK6kPFaF2GGC30XIEI28m3NBF0=
-----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-----

View File

@@ -1,72 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIG2TCCBMGgAwIBAgIQDiI8Ol3M8OHu6nJ6cbTqOjANBgkqhkiG9w0BAQsFADBb
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjElMCMGA1UEAxMcVHJ1c3RBc2lhIERWIFRMUyBSU0EgQ0EgMjAyNTAeFw0y
NjA0MjMwMDAwMDBaFw0yNjA3MjEyMzU5NTlaMB0xGzAZBgNVBAMTEmdpdC5iYW1i
b29nYW1lcy5jbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMsMThl4
aTCpOTi+sgbijjbWHt5oDWUld0MgtoFIyJS1oh3DNLH1iOX8XR81gN5c1BEreBdU
38K+09MUmfjjNR76xWG1Eqh3AvgEVJ6H9DGyLaZ3aI3m6P4RsPLSUMJ0K7jsrazq
lkXIzeaufk2Xp4cMF9fbbaUhBLsiNP+73WIkIWESL7EgLiEOr2j09+A+ba8B9xmZ
cqa+262TlU5p9bB5BJbyMuEyiE6UXD/EAMhngTrrzx0h2h1AFxtNVJGTS7TUMYta
UbS7gap3sYksYS4YBS5NlDfUjYDPtzjwswoYXvtiuAV4Y3VkQ0U10/VZ4CLg4EwV
4drs537+g+zoT28CAwEAAaOCAtUwggLRMB8GA1UdIwQYMBaAFLQSKKW0wB2fKXFp
PNkRlkp1aVDAMB0GA1UdDgQWBBSCAXFrvb9mYpKL3ua40hg+QkyOKzAdBgNVHREE
FjAUghJnaXQuYmFtYm9vZ2FtZXMuY24wPgYDVR0gBDcwNTAzBgZngQwBAgEwKTAn
BggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB
/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATB5BggrBgEFBQcBAQRtMGswJAYI
KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3
aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL1RydXN0QXNpYURWVExTUlNBQ0Ey
MDI1LmNydDAMBgNVHRMBAf8EAjAAMIIBgAYKKwYBBAHWeQIEAgSCAXAEggFsAWoA
dgDCMX5XRRmjRe5/ON6ykEHrx8IhWiK/f9W1rXaa2Q5SzQAAAZ259IEWAAAEAwBH
MEUCIFL1pBL/7olfxuB3l7pL2qiNHghmHRbspTTP8ciYAZ4uAiEAybJLiXAxs2k/
D51CWbVEZthLvqApXOpannaI1ehUXooAdwDYCVU7lE96/8gWGW+UT4WrsPj8XodV
Jg8V0S5yu0VLFAAAAZ259IPVAAAEAwBIMEYCIQDktRKhH2Alo3H5nv8dKYIQcsat
l1YLiweSJCTLBnwBQgIhAJIQ+BmV6ObgMYdU+J3hn1vDjfF1yWkOzFYy9ElFKcpn
AHcAlE5Dh/rswe+B8xkkJqgYZQHH0184AgE/cmd9VTcuGdgAAAGdufSBJQAABAMA
SDBGAiEA2YbbOGMgc7VgALCecgkcCc2tGWtNxLi4d1MGtNrJvYgCIQCTKOw+yz+Y
nAoP4zdXXzTywyEMrZyBkIXcSCY45vPqFTANBgkqhkiG9w0BAQsFAAOCAgEArTD4
s92olE+wwrmCrqiBBkeVuwZ9rjxmKpsNUsFXonsO0mZ5mrnxZ2tv7mQ9C+dtfZ3d
kslvYEpcQTSijTX4sMKVPs20SSHGX5fsj6UHWrEjhIq4oFajkovZxOxKJPPcZVt9
MrhoTJxZatmB/vLJwOz/H94N80rf0O5/r1VVyAyiEOrFfPp1ZZsHmPOxAPk/YXXE
x1yQIaW5/9GV148XnbGf9F1LBt1/uexkILGlJjBsa0X3QEKADih3+PIzAY293/5b
TQVFG5LbQV8xvCyUqQQVQgN4PPdHJBqzp2bDEpL/b7whJppXu+lcAE7n8Y3dvWHM
4plil8JoqLM7GkYKcj2bcGNwB93a8X5BYpgxh3qUULv96jWTl+QorMWIRrSJMHbO
y1IrDkGDrik9tsA0zDqKYC2qIx1F72PPkul3NmGPPsDHXG1AYfrw6+DOSocnrBPj
Ym8vBl9WcvS7BcYgqg1MTda+6M9VIYJrgFviMgFJ87fNZN2RYDLmRsftJFiDSX/4
F2Q/d4NFLVaVtsdxzIx86HP4E2A1g3VswAFkvcBjO5g3ZAhPZ7dqv60GZ/QPLio/
QyPIncRq5MbCsQC3IkOCXVR1XBrOHIXFxgSMHfnifo9RBeUfYArPyCHiYvJZZBv/
Bj8F9U7Muky3HSK6kPFaF2GGC30XIEI28m3NBF0=
-----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-----