木偶:不能通过API手动生成证书并发出证书请求

我花了太多的时间试图弄清楚现在,我真的需要一个指针。 tl; dr是我需要在一个节点上手动生成证书,然后通过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主机(从客户端)发出证书请求

API已经打开了远程API调用,所以我们可以从testing节点进行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调用似乎都正常工作,包括签名和DELETE /撤消节点。 这只是看起来失败的证书请求调用。 也许我错过了一些明显的东西。

木偶大师正在运行“3.7.2-1puppetlabs”。

与Puppet Labs的好伙伴们一起sorting。 正确的签名证书请求调用应该是:

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

首先,我注意到,在你的shell代码片段中,你的提示符是'$'。 毫无疑问,傀儡configuration与我的不同,但我需要以root身份运行这些命令。 几乎可以肯定,在客户端系统上,你会以root身份运行木偶。 如果你运行puppetmaster作为root以外的东西,那么大概你会以该用户的身份运行puppet CA命令。

其次,(也可能有不同的关于你的设置),我不需要直接运行openssl命令。 我用傀儡命令做所有事情。

我所做的是:

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

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

 puppet agent --test 

假设密钥尚未退出,上面将显示证书的指纹,但如果您随后需要显示它,请使用:

 puppet agent --fingerprint --noop 

木偶大师(作为根):

 puppet cert list 

检查指纹,然后执行:

 puppet cert sign [client's fqdn] 

如果出现问题,请在/ var / lib / puppet / ssl(在客户端)和/ var / lib / puppet / ssl / ca(在主服务器上)查找各种密钥,证书和证书请求。 根据我的经验,布局是自我解释的,可以安全地将东西抹掉并期望重新生成。

我确实看到你在具体询问API,但是你真的需要手动访问吗? 如果你这样做,然后按照上面的配方,生成证书,证书请求等,然后使用openssl命令来查看我所指出的位置创build的文件,并与你正在生成的内容进行比较。

如果涉及到查看API请求的puppet格式,我会做的就是使用ltrace来捕获传递给openssl库调用的数据。 更熟悉ruby框架木偶使用的人可能会select在其中插入一些debugging代码。 (尽pipeltrace在生产服务器上更安全)