Red Hat Training

A Red Hat training course is available for RHEL 8

3.6. 使用 GnuTLS 创建私有 CA

当您的情况需要验证您的内部网络内实体时,私有证书颁发机构(CA)非常有用。例如,当基于您控制下的 CA 签名的证书或通过身份验证创建 VPN 网关时,或者您不想支付商业 CA 时,使用私有 CA。要在这样的用例中签署证书,私有 CA 使用自签名证书。

前提条件

  • 您有 root 权限或使用 sudo 输入管理命令的权限。需要此类权限的命令标记为 #
  • 您已在系统上安装了 GnuTLS。如果没有,您可以使用这个命令:

    $ yum install gnutls-utils

流程

  1. 为您的 CA 生成私钥。例如,以下命令会创建一个 256 位 ECDSA (Elliptic Curve Digital Signature Algorithm)密钥:

    $ certtool --generate-privkey --sec-param High --key-type=ecdsa --outfile <ca.key>

    密钥生成过程的时间取决于主机的硬件和熵、所选算法以及密钥长度。

  2. 为证书创建一个模板文件。

    1. 使用您选择的文本编辑器创建一个文件,例如:

      $ vi <ca.cfg>
    2. 编辑文件以包含必要的认证详情:

      organization = "Example Inc."
      state = "Example"
      country = EX
      cn = "Example CA"
      serial = 007
      expiration_days = 365
      ca
      cert_signing_key
      crl_signing_key
  3. 使用在第 1 步中生成的私钥创建一个签名的证书:

    生成的 <ca.crt> 文件是一个自签名 CA 证书,可用于为其他证书签名一年。<ca.crt> 文件是公钥(证书)。加载的文件 <ca.key> 是私钥。您应该将此文件保存在安全的地方。

    $ certtool --generate-self-signed --load-privkey <ca.key> --template <ca.cfg> --outfile <ca.crt>
  4. 对 CA 的私钥设置安全权限,例如:

    # chown <root>:<root> <ca.key>
    # chmod 600 <ca.key>

后续步骤

  • 要将自签名 CA 证书用作客户端系统上的信任锚,请将 CA 证书复制到客户端,并以 root 用户身份将其添加到客户端的系统范围信任存储中:

    # trust anchor <ca.crt>

    如需更多信息,请参阅 第 4 章 使用共享的系统证书

验证

  1. 显示有关自签名 CA 的基本信息:

    $ certtool --certificate-info --infile <ca.crt>
    Certificate:
    …
        	X509v3 extensions:
            	…
            	X509v3 Basic Constraints: critical
                	CA:TRUE
            	X509v3 Key Usage: critical
                	Certificate Sign, CRL Sign
  2. 创建证书签名请求(CSR),并使用您的 CA 为请求签名。CA 必须成功基于 CSR 创建证书,例如:

    1. 为您的 CA 生成一个私钥:

      $ certtool --generate-privkey --outfile <example-server.key>
    2. 在您选择的文本编辑器中打开一个新配置文件,例如:

      $ vi <example-server.cfg>
    3. 编辑文件以包含必要的认证详情:

      signing_key
      encryption_key
      key_agreement
      
      tls_www_server
      
      country = "US"
      organization = "Example Organization"
      cn = "server.example.com"
      
      dns_name = "example.com"
      dns_name = "server.example.com"
      ip_address = "192.168.0.1"
      ip_address = "::1"
      ip_address = "127.0.0.1"
    4. 使用之前创建的私钥生成一个请求:

      $ certtool --generate-request --load-privkey <example-server.key> --template <example-server.cfg> --outfile <example-server.crq>
    5. 生成证书并使用 CA 的私钥对其签名:

      $ certtool --generate-certificate --load-request <example-server.crq> --load-ca-certificate <ca.crt> --load-ca-privkey <ca.key> --outfile <example-server.crt>

      其他资源

      • certtool(1)trust(1) 手册页