如何使用openssl生成自签证书

4 阅读4分钟

在学习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.keytls.csrtls.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)。

五、常见问题排查

  1. 客户端提示x509证书错误

    • 原因:客户端未配置证书信任,或CN字段与访问地址不一致;
    • 解决:确认/etc/docker/certs.d/服务器IP/ca.crt存在,且CN字段和访问 IP/域名一致。
  2. 证书过期

    • 解决:重新执行步骤4,生成新的证书(修改-days参数可延长有效期,比如-days 730=2年)。
  3. 私钥权限过高

    • 原因:tls.key权限大于600,服务(如 Harbor/Nginx)拒绝读取;
    • 解决:执行chmod 600 tls.key

六、总结

  1. 自签证书适合学习/测试环境,核心命令仅3条:生成私钥→生成 CSR→自签证书;
  2. CN字段必须和服务器 IP/域名一致,否则证书无效;
  3. 客户端需手动拷贝证书到指定目录并重启服务,才能信任自签证书;
  4. 生产环境建议用Let's Encrypt申请免费可信证书,无需手动配置客户端信任。