From 89b56745b07c3a86a5376b6ecfa49125b43eb331 Mon Sep 17 00:00:00 2001 From: xuans Date: Fri, 2 Oct 2026 06:14:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E7=B4=A7SSH=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E6=96=87=E6=A1=A3=E5=AE=89=E5=85=A8=E8=BE=B9?= =?UTF-8?q?=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- backend/README.md | 6 +- doc/SSH密钥配置指南.md | 183 ++++------------------------- doc/命令行运维范围说明.md | 2 +- 4 files changed, 26 insertions(+), 169 deletions(-) diff --git a/README.md b/README.md index eb954da..bc82ba8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Scert 项目 -Scert 是一个统一管理 SSL 证书、自动续期并部署到多台服务器的跨平台项目。 +Scert 是一个统一管理 SSL 证书、自动续期并通过密码 SSH 部署到多台服务器的跨平台项目。 ## 正式交付范围 @@ -26,7 +26,7 @@ Scert 是一个统一管理 SSL 证书、自动续期并部署到多台服务器 ## 开发状态 -当前已完成配置、日志、数据库迁移、域名与服务器管理、管理员认证、DNS API 在线测试、lego DNS-01、证书申请与导入、自动续期、SSH 部署、通知、设置接口和 Web 管理页面;真实 DNS、ACME、远程服务器及平台安装验收仍需在授权环境完成。 +当前已完成配置、日志、数据库迁移、域名与服务器管理、管理员认证、DNS API 在线测试、lego DNS-01、证书申请与导入、自动续期、密码 SSH 部署、通知、设置接口和 Web 管理页面;SSH 私钥、公钥和密钥登录能力不属于当前产品,真实 DNS、ACME、远程服务器及平台安装验收仍需在授权环境完成。 详细内容请先阅读: diff --git a/backend/README.md b/backend/README.md index 4621e55..a411830 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,6 +1,6 @@ # Scert -Scert 是面向 Windows 和 Linux 的 SSL 证书管理服务。当前代码已覆盖核心证书生命周期、DNS-01、自动续期、SSH 部署、通知、认证和 Web 管理流程。 +Scert 是面向 Windows 和 Linux 的 SSL 证书管理服务。当前代码已覆盖核心证书生命周期、DNS-01、自动续期、密码 SSH 部署、通知、认证和 Web 管理流程。 正式交付仅包含 Web 和服务端。CLI 限定为初始化、服务启动、运维诊断、数据库维护、备份恢复、服务安装和卸载入口;历史 `domain`、`server`、`ssh-key`、`renew`、`deploy` 命令已停用,仅返回中文迁移提示,不执行原业务操作。命令边界见 `../doc/命令行运维范围说明.md`。Wails 历史实现不参与正式发布及测试门禁。 @@ -36,7 +36,7 @@ go run ./cmd/scert serve --base-dir C:\ScertData - `POST /api/v1/domains` - `DELETE /api/v1/domains/:id` -当前 `serve` 已接入配置加载、数据库迁移、认证、DNS 在线测试、ACME 证书申请、自动续期、证书导入、SSH 部署和通知流程。HTTPS 生产切换、真实 DNS/ACME 申请、远程服务器及平台安装仍需授权环境验收。 +当前 `serve` 已接入配置加载、数据库迁移、认证、DNS 在线测试、ACME 证书申请、自动续期、证书导入、密码 SSH 部署和通知流程。SSH 私钥、公钥和密钥登录能力已禁用;HTTPS 生产切换、真实 DNS/ACME 申请、远程服务器及平台安装仍需授权环境验收。 ### 开发阶段使用 9004 与 9003 端口 @@ -108,7 +108,7 @@ Remove-Item Env:GOARCH ## 当前生产验收边界 -代码层已实现 ACME/lego 申请、第一批 DNS Provider、CNAME 委派、自动续期、证书导入、SSH/SFTP 部署、Nginx/Caddy/Apache reload、通知和 Web 管理接口。以下项目不能仅凭本地自动化测试宣称生产完成:真实 DNS 权限与公网传播、Let’s Encrypt Production 签发、真实远程服务器部署、Windows Service、Linux systemd 实机安装、Wails 桌面封装、Windows ACL、MySQL 真实实例和最终 HTTPS 到达性验收。 +代码层已实现 ACME/lego 申请、第一批 DNS Provider、CNAME 委派、自动续期、证书导入、密码 SSH/SFTP 部署、Nginx/Caddy/Apache reload、通知和 Web 管理接口。SSH 私钥、公钥和密钥登录能力已禁用。以下项目不能仅凭本地自动化测试宣称生产完成:真实 DNS 权限与公网传播、Let’s Encrypt Production 签发、真实远程服务器部署、Windows Service、Linux systemd 实机安装、Wails 桌面封装、Windows ACL、MySQL 真实实例和最终 HTTPS 到达性验收。 ## 首轮复审状态 diff --git a/doc/SSH密钥配置指南.md b/doc/SSH密钥配置指南.md index 58ef911..0062df0 100644 --- a/doc/SSH密钥配置指南.md +++ b/doc/SSH密钥配置指南.md @@ -1,178 +1,35 @@ -# SSH 密钥配置指南 +# SSH 登录配置说明 -本文用于帮助不熟悉 SSH 的用户完成 Scert 远程服务器部署配置。Scert 只使用 SSH 密钥认证,不保存或使用远程服务器登录密码。本机为每台主机、每次配置生成随机密钥文件名,最终公钥路径为 `/ssl/ssh/<用户名>+scert-<随机标识>`,不保留 `.pub` 后缀。 +本说明用于明确当前产品的安全边界。Scert 远程服务器连接**仅支持 SSH 密码认证**,不提供、不生成、不读取、不保存、不上传 SSH 私钥或公钥,也不会写入远程 `authorized_keys`。 -## 一、配置流程 +## 当前配置流程 -SSH 配置分为三步: - -1. 在自己的电脑上生成一对 SSH 密钥。 -2. 将公钥安装到远程服务器的授权文件中。 -3. 将本机私钥录入 Scert,Scert 会在保存时加密存储。 - -密钥分为两部分: - -- **私钥**:只保存在自己的电脑或 Scert 的加密敏感信息存储中,不能发送给他人,不能提交到 Git。 -- **公钥**:可以安装到远程服务器,用于验证私钥对应的客户端。 - -## 二、Windows 生成密钥 - -Windows 10、Windows 11 和较新的 Windows Server 通常已经包含 OpenSSH 客户端。打开 PowerShell,复制并执行: - -```powershell -ssh-keygen -t ed25519 -C "scert-deploy" -f "$HOME\.ssh\scert_deploy_ed25519" -``` - -执行过程中: - -1. 如果提示创建目录,输入 `Y` 或按回车确认。 -2. 如果提示输入私钥口令,可以设置一个口令;如果希望配置更简单,也可以直接按两次回车留空。 -3. 私钥默认保存为:`%USERPROFILE%\.ssh\scert_deploy_ed25519`。 -4. 公钥默认保存为:`%USERPROFILE%\.ssh\scert_deploy_ed25519.pub`。 - -查看公钥内容: - -```powershell -Get-Content "$HOME\.ssh\scert_deploy_ed25519.pub" -``` - -复制公钥内容时,要从 `ssh-ed25519` 开始复制到末尾的注释,必须保持为一整行。 - -## 三、Linux 或 macOS 生成密钥 - -打开终端,复制并执行: - -```bash -ssh-keygen -t ed25519 -C "scert-deploy" -f ~/.ssh/scert_deploy_ed25519 -``` - -查看公钥内容: - -```bash -cat ~/.ssh/scert_deploy_ed25519.pub -``` - -默认文件位置: - -- 私钥:`~/.ssh/scert_deploy_ed25519` -- 公钥:`~/.ssh/scert_deploy_ed25519.pub` - -建议设置本地私钥权限: - -```bash -chmod 700 ~/.ssh -chmod 600 ~/.ssh/scert_deploy_ed25519 -chmod 644 ~/.ssh/scert_deploy_ed25519.pub -``` - -## 四、把公钥安装到 Linux 服务器 - -如果本机安装了 `ssh-copy-id`,可以执行: - -```bash -ssh-copy-id -i ~/.ssh/scert_deploy_ed25519.pub 用户名@服务器地址 -``` - -命令会要求输入一次服务器登录密码。密码只用于把公钥安装到服务器,不会提交给 Scert。 - -如果没有 `ssh-copy-id`,先查看公钥: - -```bash -cat ~/.ssh/scert_deploy_ed25519.pub -``` - -然后使用服务器控制台或已有登录方式,在远程服务器执行: - -```bash -umask 077 -mkdir -p ~/.ssh -cat >> ~/.ssh/authorized_keys -``` - -执行后将公钥整行粘贴进去,按回车,再按 `Ctrl+D` 结束输入。最后设置权限: - -```bash -chmod 700 ~/.ssh -chmod 600 ~/.ssh/authorized_keys -``` - -如果远程服务器使用的是其他登录用户,必须把公钥放到该用户自己的 `~/.ssh/authorized_keys`,不能误放到 root 用户目录。 - -## 五、把公钥安装到 Windows OpenSSH 服务器 - -Windows 服务器需要先确认 OpenSSH Server 已安装并运行。对于普通用户,将公钥追加到该用户的 `.ssh\authorized_keys` 文件;对于管理员账户,Windows OpenSSH 通常使用系统级管理员授权文件,具体位置以服务器 OpenSSH 配置为准。 - -建议优先使用服务器管理员提供的 OpenSSH 配置方式,不要直接覆盖已有授权文件。追加公钥时只能新增一行,不能删除其他用户已经配置的公钥。 - -## 六、在 Scert 中录入私钥 - -在 Scert 的服务器配置页面: - -1. 点击“新建或导入”。 -2. 选择自己的操作系统标签,查看对应的密钥生成和公钥安装命令。 -3. 在“私钥名称”中填写容易识别的名称,例如“测试服务器部署密钥”。 -4. 可以直接把私钥内容粘贴到“私钥内容”,也可以点击文件选择框读取本机私钥文件。 -5. 如果生成密钥时设置了口令,在“私钥口令”中填写相同口令;未设置口令时留空。 -6. 确认内容无误后点击“加密保存”。 -7. 返回服务器配置,选择刚刚保存的 SSH 私钥。 - -Scert 页面显示的本机密钥路径遵循以下规则: - -- 私钥:`/ssl/ssh/<用户名>+scert-<随机标识>.key` -- 公钥:`/ssl/ssh/<用户名>+scert-<随机标识>` - -生成命令会先由 `ssh-keygen` 临时产生 `.pub` 文件,然后将该文件移动为不带 `.pub` 后缀的公钥目标文件。每台主机、每次新建配置都会生成新的随机标识;远程服务器仍只需要把公钥内容追加到授权文件。 - -读取本机私钥文件只会把内容放入当前页面内存,仍需点击“加密保存”才会提交。关闭窗口或刷新页面前,请确认已经完成保存。 - -## 七、测试连接前检查 - -配置服务器时需要填写: +在服务器配置页面填写以下内容: - 服务器地址和 SSH 端口,默认端口为 `22`。 - SSH 用户名。 -- 已加密保存的 SSH 私钥。 +- SSH 登录密码。 - SSH 主机 `SHA256` 指纹。 -- 远程证书、完整证书链和私钥路径。 +- 远程证书、完整证书链和证书私钥路径。 -首次连接前,请通过可信的服务器控制台或管理员渠道核对主机指纹。不要为了绕过连接失败而随意删除指纹校验。 +保存服务器配置后,Scert 只使用受保护的密码凭据建立 SSH 连接,并校验服务器主机指纹。密码不会在页面回显、日志中输出或作为命令参数写入。 -测试环境当前包括: +## 明确禁止的操作 -- `192.168.2.3` -- `192.168.2.4` +- 不要在 Scert 中录入 SSH 私钥或公钥。 +- 不要在 Scert 中生成 SSH 密钥对。 +- 不要使用 `ssh-keygen`、`ssh-copy-id` 或其他方式为 Scert 部署登录密钥。 +- 不要由 Scert 创建或修改远程 `authorized_keys`。 +- 不要为了绕过密码认证失败而开启 `PubkeyAuthentication`。 -上述地址仅用于授权测试,不应直接写入生产配置。生产环境应由用户自行填写实际服务器地址,并重新核对主机指纹和远程路径。 +页面中出现的“证书私钥路径”仅用于目标 Web 服务器的 TLS 证书部署,与 SSH 登录认证完全不同,不能用于 SSH 登录。 -## 八、常见问题 +## 连接失败处理 -### 1. 提示权限不足 +如果连接失败,请核对服务器地址、端口、用户名、密码、主机指纹和远程账号权限。不要删除主机指纹校验,也不要切换为密钥认证。需要调整服务器 SSH 策略时,应通过服务器控制台或可信的系统维护流程完成,并保持密码认证要求。 -检查远程用户是否有权读取或替换证书目录,以及是否有权执行 Nginx、Caddy 或 Apache 的重载命令。不要直接给服务账号授予不必要的全盘权限。 +## 安全要求 -### 2. 提示私钥格式错误 - -请确认录入的是私钥文件,而不是 `.pub` 公钥文件。私钥内容通常以 `BEGIN` 开头;公钥通常以 `ssh-ed25519`、`ssh-rsa` 或类似标识开头。 - -### 3. 设置了私钥口令但连接失败 - -检查 Scert 中填写的私钥口令是否与生成密钥时设置的口令完全一致。配置页面允许明文显示口令,便于确认输入;保存后由后端加密存储,接口不返回明文。 - -### 4. 不知道怎么操作 - -最简单的方式是: - -1. 在 Scert 弹窗中复制密钥生成命令。 -2. 在自己的电脑上执行命令。 -3. 将公钥安装命令中的服务器地址和用户名替换为实际值并执行。 -4. 回到 Scert,选择刚生成的私钥文件。 -5. 点击“加密保存”,再配置服务器。 - -## 九、安全注意事项 - -- 不要把私钥发送给任何人。 -- 不要把私钥、公钥安装密码或 DNS 密钥提交到 Git。 -- 不要把私钥粘贴到远程服务器;远程服务器只需要公钥。 -- 不要覆盖远程服务器已有的 `authorized_keys` 文件。 -- 服务器地址、端口、用户和主机指纹应按环境分别配置。 -- 测试机的配置不能直接复制到生产环境。 +- 服务器密码只通过受保护的凭据存储保存,不提交到 Git、脚本、日志或工单。 +- 生产服务器应关闭 SSH 公钥认证,使用密码唯一认证策略。 +- Scert 管理服务和数据库不直接暴露公网,远程管理入口应通过 Nginx 的 `80/443` 反代访问。 \ No newline at end of file diff --git a/doc/命令行运维范围说明.md b/doc/命令行运维范围说明.md index 43039b5..fab485b 100644 --- a/doc/命令行运维范围说明.md +++ b/doc/命令行运维范围说明.md @@ -38,7 +38,7 @@ 1. 保留用于启动服务、查看状态、诊断、备份恢复及平台服务管理的现有运维流程。 2. 停止依赖旧业务命令的定时任务和自动化调用,避免非零退出被误当成成功。 -3. 在 Web 中管理域名、DNS 账户、服务器和 SSH 凭据,发起手动申请、续期、导入及部署。 +3. 在 Web 中管理域名、DNS 账户和服务器密码凭据,发起手动申请、续期、导入及部署;不提供 SSH 私钥、公钥或密钥登录配置。 4. 自动续期继续由服务端执行,不需要额外配置 `scert renew` 定时任务。 这次变更只收敛 CLI 入口,不代表 Web 的统一任务中心、项目隔离、完整审计或生产门禁已全部完成;这些仍按对应整改项执行。