在学习Docker、K8s、Harbor等云原生技术时,我们经常需要HTTPS证书来实现安全访问(比如docker login私有仓库、K8s 集群认证)。对于个人学习/测试环境,无需申请付费证书,用OpenSSL生成「自签证书」即可满足需求。
一、前置知识:自签证书是什么?
自签证书是指自己作为证书颁发机构(CA),给自己的服务器颁发的证书,核心特点:
- ✅ 免费:无需向第三方CA机构申请,用OpenSSL即可生成;
- ✅ 便捷:3条命令搞定,2分钟内完成;
- ❗ 仅适合学习/测试:浏览器/客户端默认不信任,需手动配置信任(生产环境建议用Let's Encrypt免费可信证书)。
二、核心文件说明
生成自签证书会得到 3 个关键文件,对应 “申请身份证” 的流程:
表格
| 文件 | 作用 | 重要性 |
|---|---|---|
tls.key | 私钥,服务器独有,用于加密/签名,绝不对外泄露 | 最高(丢了则证书失效) |
tls.csr | 证书签名请求,包含服务器IP/ 域名等信息,相当于 “证书申请表” | 临时(生成证书后可删) |
tls.crt | 最终的自签证书,发给客户端验证服务器身份,相当于 “审核通过的身份证” | 对外(给客户端信任) |
三、实操步骤:生成自签证书
环境准备
-
操作系统:Linux;
-
预装OpenSSL:执行
openssl version验证,无则安装:# CentOS yum install -y openssl # Ubuntu apt install -y openssl
步骤 1:创建证书存储目录
建议将证书统一放在/data/cert目录:
mkdir -p /data/cert && cd /data/cert
步骤 2:生成私钥(tls.key)
私钥是证书的核心,执行以下命令生成 2048 位的 RSA 私钥(2048 位兼顾安全性和性能):
openssl genrsa -out tls.key 2048
- 参数说明:
genrsa表示生成 RSA 私钥,-out tls.key指定输出文件名,2048是密钥长度; - 验证:执行
ls -l tls.key,能看到文件即生成成功,建议设置权限chmod 600 tls.key(仅所有者可读,防止泄露)。
步骤 3:生成证书签名请求(tls.csr)
CSR 文件包含服务器的核心信息(如IP/域名、组织等),执行命令时按需填写(括号内为示例,可根据实际修改):
openssl req -new -key tls.key -out tls.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=dev/CN=192.168.1.100"
-
参数说明:
-
req -new:生成新的CSR文件; -
-key tls.key:指定用步骤2生成的私钥签名; -
-subj:批量填写CSR信息,无需交互式输入,字段说明:C:国家代码(CN=中国);ST:省份(Beijing=北京);L:城市(Beijing=北京);O:组织/公司(dev=测试环境);CN:核心!服务器的 IP/域名(必须和后续访问的地址一致,比如Harbor的IP、Nginx的域名)。
-
步骤 4:生成自签证书(tls.crt)
用私钥签名 CSR 文件,生成最终的自签证书(有效期 365 天,可按需修改):
openssl x509 -req -days 365 -in tls.csr -signkey tls.key -out tls.crt
-
参数说明:
x509:生成 X.509 格式的证书;-days 365:证书有效期(365 天);-in tls.csr:指定输入的 CSR 文件;-signkey tls.key:用私钥自签(自己作为 CA);
-
验证:执行
ls -l,能看到tls.key、tls.csr、tls.crt三个文件即生成成功。
四、实战场景:让客户端信任自签证书
自签证书默认不被Docker/浏览器信任,需手动配置客户端信任,以Docker客户端为例(比如访问 Harbor 私有仓库):
步骤 1:拷贝证书到客户端指定目录
将服务器的tls.crt拷贝到所有需要访问的客户端机器,并重命名为ca.crt:
# 客户端机器执行(替换为你的Harbor/服务器IP)
mkdir -p /etc/docker/certs.d/192.168.1.100
# 从服务器拷贝证书(也可手动复制)
scp root@192.168.1.100:/data/cert/tls.crt /etc/docker/certs.d/192.168.1.100/ca.crt
步骤 2:重启 Docker 服务
systemctl restart docker
此时客户端即可正常访问使用该自签证书的服务(比如docker login 192.168.1.100)。
五、常见问题排查
-
客户端提示x509证书错误:
- 原因:客户端未配置证书信任,或
CN字段与访问地址不一致; - 解决:确认
/etc/docker/certs.d/服务器IP/ca.crt存在,且CN字段和访问 IP/域名一致。
- 原因:客户端未配置证书信任,或
-
证书过期:
- 解决:重新执行步骤4,生成新的证书(修改
-days参数可延长有效期,比如-days 730=2年)。
- 解决:重新执行步骤4,生成新的证书(修改
-
私钥权限过高:
- 原因:
tls.key权限大于600,服务(如 Harbor/Nginx)拒绝读取; - 解决:执行
chmod 600 tls.key。
- 原因:
六、总结
- 自签证书适合学习/测试环境,核心命令仅3条:生成私钥→生成 CSR→自签证书;
CN字段必须和服务器 IP/域名一致,否则证书无效;- 客户端需手动拷贝证书到指定目录并重启服务,才能信任自签证书;
- 生产环境建议用Let's Encrypt申请免费可信证书,无需手动配置客户端信任。