# 3x-ui 证书部署与排障教程 ## 一句话原则 先保证**域名解析正确**和**80 端口可用于 Let’s Encrypt 验证**,再申请证书;申请完成后一定检查**证书文件是否完整**,以及**面板端口实际是否已经启用 HTTPS**。 --- ## 一、部署前准备 ### 1. 准备域名并解析到服务器公网 IP 例如: - `cc.opentouch.top` 检查命令: ```bash nslookup cc.opentouch.top ``` 或: ```bash ping cc.opentouch.top ``` 要求:解析出来的 IP 必须是当前服务器公网 IP。 --- ### 2. 放行端口 至少放行以下端口: - `80`:Let’s Encrypt 申请证书时做 HTTP-01 验证 - `443`:标准 HTTPS / 后续反代可能会用到 - `3x-ui 面板端口`,例如 `50325` 需要同时检查: - 云平台安全组 - 服务器本机防火墙 --- ### 3. 检查 80 端口是否被占用 ```bash ss -ltnp | grep ':80' ``` 如果 80 端口已被 Nginx / Apache / Caddy 等服务占用,申请证书时要注意冲突。 --- ## 二、在 3x-ui 中申请证书的正确顺序 进入菜单: ```bash x-ui ``` 选择: - `19` → `SSL Certificate Management` 这里最关键的两个选项: - `19 -> 1`:`Get SSL (Domain)`,用于**申请域名证书** - `19 -> 5`:`Set Cert paths for the panel`,用于**把证书绑定给面板** > 注意:进入 `19` 不等于证书已经可用。 --- ## 三、正确部署步骤 ### 第一步:申请证书 走: - `19 -> 1` 输入域名,例如: - `cc.opentouch.top` 如提示端口,一般使用默认的 `80`。 ### 第二步:绑定证书路径给面板 走: - `19 -> 5` 常见路径: ```bash /root/cert/你的域名/fullchain.pem /root/cert/你的域名/privkey.pem ``` 例如: ```bash /root/cert/cc.opentouch.top/fullchain.pem /root/cert/cc.opentouch.top/privkey.pem ``` ### 第三步:重启 3x-ui ```bash x-ui restart ``` --- ## 四、如何确认证书真的没问题 不要只看菜单提示成功,要做下面 3 个检查。 ### 检查 1:证书文件是否存在且非空 ```bash ls -l /root/cert/你的域名/ ``` 例如: ```bash ls -l /root/cert/cc.opentouch.top/ ``` 重点看: - `fullchain.pem` - `privkey.pem` 正常情况: - 两个文件都存在 - `fullchain.pem` 不是 `0` 字节 如果 `fullchain.pem` 是空文件,说明证书损坏或签发未完成。 --- ### 检查 2:证书内容是否是 PEM 格式 ```bash sed -n '1,5p' /root/cert/你的域名/fullchain.pem ``` 正常应看到: ```text -----BEGIN CERTIFICATE----- ``` 检查私钥: ```bash sed -n '1,5p' /root/cert/你的域名/privkey.pem ``` 正常应看到: ```text -----BEGIN EC PRIVATE KEY----- ``` 或: ```text -----BEGIN PRIVATE KEY----- ``` 如果 `fullchain.pem` 为空,或者没有 `BEGIN CERTIFICATE`,说明文件不可用。 --- ### 检查 3:面板端口实际是不是 HTTPS ```bash curl -vk https://你的域名:面板端口/ ``` 例如: ```bash curl -vk https://cc.opentouch.top:50325/ ``` 如果报类似错误: - `SSL_ERROR_RX_RECORD_TOO_LONG` - `wrong version number` 通常说明该端口实际还在跑 **HTTP**,并没有真正启用 HTTPS。 --- ## 五、为什么明明配置了 19,还会出现 80 端口问题 这是 3x-ui 新手最容易误解的点。 ### 原因 你最终访问的是: ```text https://域名:50325/ ``` 但 **Let’s Encrypt 在签发域名证书时**,默认需要从公网访问: ```text http://域名/.well-known/acme-challenge/... ``` 也就是说: - `50325` 是面板服务端口 - `80` 是证书验证端口 所以即使你是给 `50325` 配 HTTPS,申请证书时依然可能卡在 `80`。 --- ## 六、为什么会出现“证书损坏” 常见表现: - `fullchain.pem` 是空文件 - `privkey.pem` 有内容 - 日志中出现: ```text tls: failed to find any PEM data in certificate input ``` 这表示: - 面板试图启用 HTTPS - 但读取到的证书链文件无效 - 最终 HTTPS 没有真正生效 - 浏览器访问 `https://域名:端口/...` 会失败 所以不要只看 3x-ui 菜单提示,一定要检查文件本身。 --- ## 七、遇到问题时的标准处理方法 ### 情况 A:只是证书路径绑定错了 优先尝试: - `19 -> 5` 重新绑定正确路径后执行: ```bash x-ui restart ``` --- ### 情况 B:证书文件本身坏了 表现: - `fullchain.pem` 为空 - PEM 报错 - 面板端口实际返回 HTTP 而不是 HTTPS 这种情况不要只重复点一次 `19 -> 1`,更稳妥的方法是: 1. 清理损坏的 ACME 状态 2. 重新申请证书 3. 重新安装到 `/root/cert/域名/` 4. 重启 `x-ui` 5. 再验证 HTTPS --- ## 八、推荐的标准部署流程 以后在新服务器部署 3x-ui,建议固定按下面顺序操作: 1. 安装 3x-ui 2. 配置域名解析到服务器公网 IP 3. 放行 `80` / `443` / 面板端口 4. 确认 80 端口没有冲突 ```bash ss -ltnp | grep ':80' ``` 5. 在 `19 -> 1` 申请域名证书 6. 检查证书文件是否非空 ```bash ls -l /root/cert/你的域名/ ``` 7. 在 `19 -> 5` 绑定证书路径给面板 8. 重启 3x-ui ```bash x-ui restart ``` 9. 实测 HTTPS 是否正常 ```bash curl -vk https://你的域名:面板端口/ ``` --- ## 九、30 秒排障清单 以后打不开 `https://域名:端口/...`,按这个顺序查: 1. 域名解析是否正确 2. 80 端口是否能用于 Let’s Encrypt 验证 3. `/root/cert/域名/fullchain.pem` 是否为空 4. x-ui 日志里是否有 PEM 报错 5. 面板端口实际跑的是 HTTP 还是 HTTPS 6. 决定是“重绑证书”还是“重签证书” --- ## 十、最短结论 - `19` 只是证书管理入口,不代表证书一定已经可用 - 给 `50325` 配 HTTPS,不代表申请证书时不需要 `80` - 证书申请完成后,必须检查 `fullchain.pem` 是否有效 - 如果 `fullchain.pem` 是空的,HTTPS 一定不能正常工作 - 以后不要盲目重复点 `19`,先判断是**绑定问题**还是**证书损坏问题**