三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

告别自签名警告:为Proxmox VE管理界面配置域名与SSL证书

告别自签名警告:为Proxmox VE管理界面配置域名与SSL证书

1. 为什么需要替换Proxmox VE的自签名证书?

每次打开Proxmox VE管理界面时,那个刺眼的红色警告页面是不是让你很头疼?这是因为它使用了自签名SSL证书。自签名证书就像自己手写的工作证,虽然也能证明身份,但因为没有权威机构背书,浏览器就会发出安全警告。

我在管理公司服务器集群时就遇到过这个困扰。新来的运维同事每次登录都会紧张地问我:"这个警告页面正常吗?会不会有安全问题?"更麻烦的是,某些安全策略严格的浏览器甚至会直接阻止访问,严重影响工作效率。

自签名证书主要存在三个问题:

  1. 浏览器警告影响使用体验
  2. 可能被误认为是钓鱼网站
  3. 部分安全扫描工具会将其标记为风险项

相比之下,受信任的CA机构颁发的SSL证书:

  • 消除浏览器警告提示
  • 提升管理界面专业度
  • 启用更安全的加密协议
  • 有利于通过安全合规检查

2. 准备工作:域名与证书获取

2.1 域名解析配置

首先你需要拥有一个域名。我在实际项目中常用阿里云和腾讯云的域名服务,它们的操作界面都很直观。假设你已经购买了example.com这个域名,现在需要添加一条A记录:

  1. 登录域名控制台
  2. 找到DNS解析设置
  3. 添加记录类型为A,主机记录填写pve(这样会生成pve.example.com)
  4. 记录值填写你的PVE服务器公网IP
  5. TTL建议设置为600秒(10分钟)
# 验证解析是否生效 ping pve.example.com # 应该返回你的服务器IP地址

提示:如果服务器在内网,需要在路由器设置端口转发,将公网IP的443端口映射到内网服务器的8006端口。

2.2 获取SSL证书

我推荐使用Let's Encrypt的免费证书,它已经被所有主流浏览器信任。certbot工具可以自动完成申请和续期:

# 安装certbot sudo apt update sudo apt install certbot # 申请证书(需要先确保域名解析已生效) sudo certbot certonly --standalone -d pve.example.com

申请成功后,证书会保存在/etc/letsencrypt/live/pve.example.com/目录下,包含:

  • fullchain.pem(证书链)
  • privkey.pem(私钥)

3. 替换PVE的SSL证书

3.1 备份原始证书

安全第一!替换前先备份原有证书:

# 进入证书目录(注意替换<主机名>为你的实际主机名) cd /etc/pve/nodes/<主机名>/ # 创建备份目录 sudo mkdir backup # 备份原有证书 sudo cp <主机名>-ssl.pem backup/ sudo cp <主机名>-ssl.key backup/

3.2 部署新证书

现在将Let's Encrypt证书复制到PVE的证书位置:

# 合并证书链和私钥(PVE需要这种格式) sudo cat /etc/letsencrypt/live/pve.example.com/fullchain.pem \ /etc/letsencrypt/live/pve.example.com/privkey.pem \ > /etc/pve/nodes/<主机名>/<主机名>-ssl.pem # 复制私钥(虽然上一步已经包含,但PVE仍需要单独文件) sudo cp /etc/letsencrypt/live/pve.example.com/privkey.pem \ /etc/pve/nodes/<主机名>/<主机名>-ssl.key

3.3 设置权限

确保证书文件权限正确:

sudo chmod 640 /etc/pve/nodes/<主机名>/<主机名>-ssl.* sudo chown root:www-data /etc/pve/nodes/<主机名>/<主机名>-ssl.*

4. 配置端口转发与防火墙

4.1 设置443端口转发

由于PVE的Web界面硬编码使用8006端口,我们需要通过iptables将443请求转发到8006:

# 添加端口转发规则 sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8006 # 保存规则 sudo iptables-save > /etc/iptables.up.rules # 创建自动加载脚本 echo -e '#!/bin/sh\n/sbin/iptables-restore < /etc/iptables.up.rules' | sudo tee /etc/network/if-pre-up.d/iptables sudo chmod +x /etc/network/if-pre-up.d/iptables

4.2 限制8006端口访问

为了安全,我们应该只允许本地访问8006端口:

# 允许本地回环访问 sudo iptables -A INPUT -i lo -p tcp --dport 8006 -j ACCEPT # 拒绝其他所有8006端口的访问 sudo iptables -A INPUT -p tcp --dport 8006 -j DROP

5. 验证与故障排查

5.1 检查证书状态

重启PVE服务后,用浏览器访问https://pve.example.com,应该能看到绿色的锁标志:

# 重启PVE服务 sudo systemctl restart pveproxy

如果仍有问题,可以检查:

  • 证书路径和权限是否正确
  • 防火墙规则是否生效
  • 域名解析是否正常

5.2 设置证书自动续期

Let's Encrypt证书每90天过期,我们需要设置自动续期:

# 创建续期脚本 echo '#!/bin/bash certbot renew --quiet --post-hook "systemctl restart pveproxy"' | sudo tee /etc/cron.weekly/renew_pve_cert sudo chmod +x /etc/cron.weekly/renew_pve_cert

这个方案我在三个不同的生产环境部署过,最久的一个已经稳定运行2年多。有一次证书续期失败,发现是因为服务器时间不同步导致的,所以建议同时配置NTP时间同步:

sudo apt install chrony sudo systemctl enable --now chrony

现在你的PVE管理界面不仅告别了烦人的安全警告,还拥有了更专业的访问方式。下次维护时,团队成员再也不会被那个红色警告页面吓到了。

← 返回列表