前言
PVE 安装时会自动创建一个有效期 10 年的 CA 证书, 我们可以利用这个 CA 证书给虚拟机中的 Web 应用签发新的 TLS 证书用于提供 HTTPS 服务. 下面以 PVE 虚拟机中通过 Docker 跑的一个 雷池 应用为例进行演示.
PVE 证书位置
官方文档: https://pve.proxmox.com/wiki/Proxmox_Cluster_File_System_(pmxcfs)#chapter_pmxcfs 下面我们只需要用到这两个文件:
文件 | 说明 |
---|---|
/etc/pve/priv/pve-root-ca.key | CA 私钥 |
/etc/pve/pve-root-ca.pem | CA 证书 |
本地导入 CA 证书
Windows 系统运行 certmgr.msc
> Trusted Root Certification Authorities > Certificates > All Tasks > Import 选择 pve-root-ca.pem
完成导入. 这样本地电脑就会信任 PVE 的 CA 证书, 后面用 CA 证书签发的应用证书也会继承信任.
签发新证书
SSH 到 PVE.
# 在 `subjectAltName` 中定义了两个 DNS 名称, 保证内网和外网两个域名都能识别
openssl req -new -subj "/C=CN/ST=Beijing/L=Beijing/O=Alian/CN=docker.alian.fun" \
-addext "subjectAltName = DNS:docker.lan, DNS:docker.alian.fun" \
-CA /etc/pve/pve-root-ca.pem -CAkey /etc/pve/priv/pve-root-ca.key \
-noenc -newkey rsa:2048 -keyout leichi.key -out leichi.pem
# 得到两个文件: 证书私钥 leichi.key 证书本体 leichi.pem
# 检查证书信息
openssl x509 -noout -text -in leichi.pem
展开解释 openssl 命令参数含义 openssl req 完整文档
-new
创建新的证书申请-subj
定义 Subject 信息-addext
添加额外的subjectAltName
属性用于定义多个别名 DNS-CA
指定 CA 证书位置-CAkey
指定 CA 私钥位置-noenc
对证书私钥不加密 (老版本 openssl 中用的是-nodes
已 deprecated)-newkey
创建新的证书私钥, 使用 2048 位长度 RSA 算法-keyout
证书私钥输出的文件名-out
证书本地输出的文件名
使用证书
在雷池管理后台分别粘贴/上传签发好的证书和私钥
证书信息被成功识别:
切换控制台证书生效:
刷新浏览器:
附: 校验证书和私钥
证书和私钥的模数(modulus)必须完全匹配才算是一对
# 计算证书模数
openssl x509 -noout -modulus -in pve-ssl.pem
# 计算私钥模数
openssl rsa -noout -modulus -in pve-ssl.key