Puppet:无法手动生成证书并通过 API 发出证书请求

Puppet:无法手动生成证书并通过 API 发出证书请求

我已经花了太多时间试图弄清楚这一点,我真的需要一个指引。简而言之,我需要在一个节点上手动生成证书,然后通过 API 发出证书请求。

根据官方文档,这应该相当简单。以下是我所做的。

为 myhost.foobar.local 生成证书(来自客户端)

$ puppet cert generate myhost.foobar.local

从证书生成 CSR(来自客户端)

$ openssl req -new -key /var/lib/puppet/ssl/private_keys/myhost.foobar.local.pem -subj "/CN=myhost.foobar.local" -out request.csr

向 Puppet Master 发出证书请求(来自客户端)

该 API 已开放远程 API 调用,因此我们可以从测试节点进行 API 调用。但是,我只收到错误返回。

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/no_key
Could not intern from s: not enough data

其他调用也很好用,例如:

$ curl -k -H "Accept: pson" https://puppetmaster:8140/production/certificate_statuses/all
[
  {
    "state" : "signed",
    "fingerprints" : {
      "default" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD",
      "SHA256" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD",
      "SHA1" : "04:13:AF:B9:CB:44:01:64:24:C9:E0:D6:F4:0D:60:41:52:77:EE:45",
      "SHA512" : "2C:97:11:B9:ED:38:00:1F:B0:7B:75:ED:4C:DB:B1:3E:3D:63:09:C1:38:E2:A3:4F:50:A4:FD:71:FF:55:94:C3:7A:0B:F6:D5:79:09:6D:53:39:B1:EC:C2:BF:DF:CD:9B:67:60:B9:9C:0C:82:51:E9:23:30:AA:33:AC:8B:E9:94"
    },
    "name" : "puppet.foobar.local",
    "dns_alt_names" : [
      "DNS:puppet",
      "DNS:puppet.foobar.local"
    ],
    "fingerprint" : "5A:35:D2:19:59:C6:6E:B8:BE:64:54:FA:14:10:CE:FC:4A:C8:45:F6:DE:8E:7C:E9:2D:B0:5B:E0:5D:93:35:DD"
  },
  {
    "state" : "signed",
    "fingerprints" : {
      "default" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF",
      "SHA256" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF",
      "SHA1" : "A4:17:D3:05:8A:72:BE:6C:C2:0C:FA:C4:8A:3B:6E:C4:29:90:4B:95",
      "SHA512" : "2D:C3:EE:7E:E3:39:99:C8:21:B8:97:E8:BF:FE:62:26:A8:B8:63:30:C9:F1:77:80:DB:FC:DF:B8:ED:1E:A2:6C:C2:F9:FE:5D:CA:17:D9:08:1E:EB:AA:AF:3D:99:A6:F9:3D:E6:86:A0:B3:3F:E9:EC:1C:7F:25:95:B5:D6:7C:51"
    },
    "name" : "965c252e48c3",
    "dns_alt_names" : [

    ],
    "fingerprint" : "32:7B:B3:4E:BE:EB:66:21:E5:96:D0:7B:BA:BF:1D:FC:D5:90:E1:6F:52:6B:AB:CF:98:7E:2A:E3:48:00:A2:CF"
  }
]

(已格式化,方便阅读)

我不确定我是否遗漏了什么。所有其他 API 调用似乎都运行良好,包括签名和删除/撤销节点。只有证书请求调用似乎失败了。也许我遗漏了一些显而易见的东西。

Puppet Master 正在运行“3.7.2-1puppetlabs”。

答案1

与 Puppet Labs 的优秀人员一起解决了这个问题。正确的签名证书请求调用应该是:

$ curl -k -X PUT -H "Content-Type: text/plain" --data-binary @request.csr https://puppetmaster:8140/production/certificate_request/hostname.foobar.local

答案2

首先,我注意到在您的 shell 代码片段中,您的提示符是“$”。毫无疑问,puppet 配置与我的不同,但我需要以 root 身份运行这些命令。在客户端系统上几乎肯定如此,您将以 root 身份运行 puppet。如果您以非 root 用户身份运行 puppetmaster,那么大概您会以该用户身份运行 puppet CA 命令。

其次,(再次强调,您的设置可能有所不同),我从来不需要直接运行 openssl 命令。我使用 puppet 命令完成所有操作。

我的做法是:

首先,确保您的客户端的 FQDN 符合您的要求,因为这将用于命名证书。请检查hostname -f

在客户端系统上(以 root 身份):

puppet agent --test

假设密钥尚不存在,上述内容将显示证书的指纹,但如果您随后需要显示它,请使用:

puppet agent --fingerprint --noop

在 puppetmaster 上(以 root 身份):

puppet cert list

检查指纹,然后执行以下操作:

puppet cert sign [client's fqdn]

如果出现问题,请在 /var/lib/puppet/ssl(在客户端上)和 /var/lib/puppet/ssl/ca(在主服务器上)中查找各种密钥、证书和证书请求。根据我的经验,布局是不言自明的,并且可以安全地擦除内容并期望它重新生成。

我确实看到您专门询问 API,但您真的需要手动访问它吗?如果需要,请按照上述方法生成证书、证书请求等,然后使用 openssl 命令查看在我指示的位置创建的文件,并与您正在生成的内容进行比较。

如果要查看 puppet 如何格式化 API 请求,我会使用 ltrace 来捕获传递到/来自 openssl 库调用的数据。更熟悉 puppet 使用的 ruby​​ 框架的人可能会选择在其中插入一些调试代码。(不过 ltrace 在生产服务器上更安全)

相关内容